類的繼承和方法的呼叫

2021-09-13 17:59:22 字數 1525 閱讀 1938

public class extendstest   

} class a

public string show(a obj)

} class b extends a

public string show(a obj)

} class c extends b

class d extends b

1--a and a

2--a and a

3--a and d

4--b and a

5--b and a

6--a and d

7--b and b

8--b and b

9--a and d

④,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(aobj),輸出為」b and a」。

再比如⑧,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(bobj)方法,找到了,由於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(aobj),如果子類b沒有覆蓋show(a obj)方法,那麼它就呼叫a的show(aobj)(由於b繼承a,雖然沒有覆蓋這個方法,但從超類a那裡繼承了這個方法,從某種意義上說,還是由b確定呼叫的方法,只是方法是在a中實現而已);現在子類b覆蓋了show(a obj),因此它最終鎖定到b的show(a obj)。這就是那句話的意義所在。

子類繼承和呼叫父類的構造方法

1.如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法,2.如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。3.如果子類呼叫父類帶引數的構造方法,可以通過super 引數 呼叫所需要的父類的構造方法,切該語句做為子類構...

子類繼承和呼叫父類的構造方法

1.如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法,2.如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。3.如果子類呼叫父類帶引數的構造方法,可以通過super 引數 呼叫所需要的父類的構造方法,切該語句做為子類構...

C 中了類繼承和呼叫父類的建構函式方法

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承 子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅...