深入理解Java多型性

2021-05-01 03:49:19 字數 1547 閱讀 4870

**:

列印:

分析:

當超類物件引用變數引用子類物件時, 被引用物件的型別而不是引用變數的型別決定了呼叫誰的成員方法, 但是這個被呼叫的方法必須是在超類中定義過的, 也就是說被子類覆蓋的方法.(但是如果強制把超類轉換成子類的話, 就可以呼叫子類中新新增而超類沒有的方法了.)

這裡涉及方法呼叫的優先順序問題, 優先順序由高到低依次為: this.show(o), super.show(o), this.show((super)o), super.show((super)o).

比如(4), a2. show(b), a2是乙個引用變數, 型別為a, 則this為a2, b是b的乙個例項, 於是它到類a裡面找show(b obj)方法, 沒有找到, 於是到a的super(超類)找, 而a沒有超類, 因此轉到第三優先順序this. show((super)o), this仍然是a2, 這裡o為b, (super)o即(super)b即a, 因此它到類a裡面找show(a obj)的方法, 類a有這個方法, 但是由於a2引用的是類b的乙個物件, b覆蓋了a的show(a obj)方法, 因此最終鎖定到類b的show(a obj), 輸出為"b and a".

再比如(8), b. show(c), b是乙個引用變數, 型別為b, 則this為b, c是c的乙個例項, 於是它到類b找show(c obj)方法, 沒有找到, 轉而到b的超類a裡面找, a裡面也沒有, 因此也轉到第三優先順序this. show((super)o), this為b, o為c, (super)o即(super)c即b, 因此它到b裡面找show(b obj)方法, 找到了, 由於b引用的是類b的乙個物件, 因此直接鎖定到類b的show(b obj), 輸出為"b and b".

按照上面的方法, 可以正確得到其他的結果.

問題還要繼續, 現在我們再來看上面的分析過程是怎麼體現出藍色字型那句話的內涵的. 它說: 當超類物件引用變數引用子類物件時, 被引用物件的型別而不是引用變數的型別決定了呼叫誰的成員方法, 但是這個被呼叫的方法必須是在超類中定義過的, 也就是說被子類覆蓋的方法. 還是拿a2. show(b)來說吧.

a2是乙個引用變數, 型別為a, 它引用的是b的乙個物件, 因此這句話的意思是由b來決定呼叫的是哪個方法. 因此應該呼叫b的show(b obj)從而輸出"b and b"才對. 但是為什麼跟前面的分析得到的結果不相符呢?! 問題在於我們不要忽略了藍色字型的後半部分, 那裡特別指明: 這個被呼叫的方法必須是在超類中定義過的, 也就是被子類覆蓋的方法. b裡面的show(b obj)在超類a中有定義嗎? 沒有! 那就更談不上被覆蓋了. 實際上這句話隱藏了一條資訊: 它仍然是按照方法呼叫的優先順序來確定的. 它在類a中找到了show(a obj), 如果子類b沒有覆蓋show(a obj)方法, 那麼它就呼叫a的show(a obj)( 由於b繼承a, 雖然沒有覆蓋這個方法, 但從超類a那裡繼承了這個方法, 從某種意義上說, 還是由b確定呼叫的方法, 只是方法是在a中實現而已); 現在子類b覆蓋了show(a obj), 因此它最終鎖定到b的show(a obj). 這就是那句話的意義所在.

深入理解C 的多型性

c 程式語言是一款程式設計客棧應用廣泛,支援多種程式設計的計算機程式語言。我們今天就會為大家詳細介紹其中c 多型性的一些基本知識,以方便大家在學習過程中對此能夠有乙個充分的掌握。多型性可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。多型 pol...

深入理解Java多型機制

目錄 1,多型的概念?2,存在的條件?3,案列解析?4,應用場景?1,多型的概念 父類引用指向子類物件,通俗點就是,在編譯時不繫結是什麼方法,根據你傳進來的值,是什麼就會執行什麼。2.存在條件 第一,要有繼承 第二,要有方法的重寫 第三,父類引用指向子類物件 3,案列解析 好好體會以下這個案例,通過...

java多型深入理解 一

很多人都知道物件導向的三大特性 繼承 封裝 多型,可是真正理解好這三特性並不是一件簡單的事.本週我打算對多型進行研究並寫下我的小例子 樂器類 class musicinstruments public void instruments musicinstruments instruments 笛子類...