記乙個關於向上轉型及多型的問題

2022-05-24 23:51:13 字數 1244 閱讀 5229

---恢復內容開始---

public class program6

}class a

public string show(a obj)

}class b extends a

public string show(a obj)

class c extends b

class d extends b

這個**源於別人,但是講的不太清楚 ,在這裡記下自己的感悟,防止以後忘記。

正文:第乙個aa: a類物件呼叫a中方法,然而並沒有 b類物件作為引數的方法,那麼找b的上個類,有乙個a的物件的方法  所以為aa

第二個aa:同樣的,呼叫a類中的方法,沒有以c類作為引數的方法,但是有a類的 為c 的父類的父類,所以列印aa

第三個ad:因為其中有d類物件作為引數的方法,所以輸出ad

第四個:父類引用指向子類物件,首先呼叫的是 物件的方法 也就是b類中的,那麼問題來了,為什麼不直接使用b類物件作為引數的方法呢,

是因為由於向上轉型,它只能訪問父類中擁有的方法和屬性,而對於不存在的方法,不能使用,意思就是只能使用重寫的方法或者父類的方法。詳情看下方

所以是ba;

第五個:ba,同上,雖然 c類繼承b類 ,但是這點只能呼叫父類中存在的方法,沒有以c類物件作為引數的方法,所以只能將c類作為a類,所以也是ba

第六個:ad ,同上,因為父類中 直接有d作為引數的方法,所以 ad

第七個:bb ,呼叫b類中以b類物件所謂引數的方法,所以bb

第八個:bb, 因為a b c 類中都沒有 以c類物件作為引數的方法,所以c類變為b類,在b類中有 以b類作為引數的方法,(注:如果這點還找不到的話,就會將c類看做a類)並且執行b類的 ba, 為什麼不是aa呢 因為覆蓋掉了 

第九個:ad:以d 物件作為引數的方法 存在,所以執行a類的, ps:這點我是這樣理解的,就是乙個類繼承乙個類的話,父類的方法沒有覆蓋調的話都會繼承過去,這就是為什麼 如果要初始化子類,一定會先載入父類。

多看看,挺有意思的題。

我們知道,向上轉型時,用父類引用執行子類物件,並可以用父類引用呼叫子類中重寫了的同名方法。但是不能呼叫子類中新增的方法。

在**的編譯階段,編譯器通過宣告物件的型別(即引用本身的型別)在方法區中該型別的方法表中查詢匹配的方法(最佳匹配法:引數型別最接近的被呼叫),如果有則編譯通過。(這裡是根據宣告的物件型別來查詢的,所以此處是查詢father類的方法表,而father類方法表中是沒有子類新增的方法的,所以不能呼叫。)

如有不正,請指出。

Developer 轉型記 乙個開發平台的「魔力」

隨著政策的加持 技術快速的迭代,人工智慧熱潮正在蔓延。2020年,ai落地大考還在繼續,隨之帶來的人才需求,也在不斷增長,同樣率先把握住機會的開發者就有更大機會佔據先機。那麼,開發者該如何借助ai技術,探索可沉澱的落地應用?在這ai技術浪潮下,實現完美的應用創新?或許華為雲mdg社群華為雲mvp毛昌...

上的乙個向下轉型問題

public class testcasting class animal class dog extends animal class cat extends animal 這一行 system.out.println d1.name 輸出null 為什麼輸出的是null而不是 bigyellow...

關於多型的乙個經典例項

廢話不多說,直接上 public class a public string show a obj public class b extends a public string show a obj public class c extends b public class d extends b ...