Java面向對象之this和super在繼承中的應用及如何實現父、子類

JAVA面向對象學習之this和super

20.1 this和super的區別和應用

1、概念:

this:代表當前對象的引用,誰調用,則就代表誰;

super:代表當前對象父類的引用。

2、this和super的使用差別:

2.1 調用成員變量:

this.成員變量 調用本類的成員變量,也可調用父類的成員變量;

super.成員變量調用父類的成員變量。

2.2 調用構造方法:

this(…)調用本類的構造方法;

super(…)調用父類的構造方法。

2.3 調用成員方法:

this.成員方法 調用本類的成員方法,也可調用父類的成員方法;

super.成員方法調用父類的成員方法。

20.2 繼承中構造方法的關係

1、子類中所有的構造方法默認都會訪問父類中的空參構造方法。

原因:因為子類會繼承父類中的數據,可能還會使用父類的數據。所以子類初始化之前,一定要先完成父類數據的初始化。

每一個構造方法的第一語句默認都是:super() Object類最頂層的父類。

案例演示如圖1所示:

Java面向對象之this和super在繼承中的應用及如何實現父、子類

圖1

2、注意事項:super(…)或者this(…)必須出現在構造方法的第一條語句上。

super();指向訪問父類的構造方法;

this();指向訪問本類中的構造方法(子類)。

案例演示如圖2、3所示:

Java面向對象之this和super在繼承中的應用及如何實現父、子類

圖2

Java面向對象之this和super在繼承中的應用及如何實現父、子類

圖3

面試題1:根據程序代碼判斷輸出結果?

程序代碼演示如圖4所示:

Java面向對象之this和super在繼承中的應用及如何實現父、子類

圖4

面試題2:根據程序代碼判斷輸出結果?

程序代碼演示如圖5所示:

Java面向對象之this和super在繼承中的應用及如何實現父、子類

圖5

說明:1、jvm調用了main方法,main進棧;

2、遇到Zi z = new Zi() ;會將Fu.class和Zi.class分別加載進內存,在創建對象,當Fu.class加載進內存,父類的靜態代碼塊會隨著Fu.class一起加載,當Zi.class加載進內存時,子類的靜態代碼塊會隨著Zi.class一起加載。

所以,第一個輸出"Fu類靜態代碼塊",第二個輸出"Zi類靜態代碼塊"。

3、走Zi類的構造方法,因為Java中是分層初始化的,先初始化父類,在初始化子類,所以先走的是父類構造,但是在執行父類構造時,發現父類有構造代碼塊,構造代碼塊優先於構造方法執行。

所以,第三個輸出"Fu類構造代碼塊",第四個"Fu類構造方法"。

4、同理,Fu類初始化完成,子類進行初始化。

所以,第五個輸出"Zi類構造代碼塊",第六個輸出"Zi類構造方法"。

3、繼承中成員方法的關係:

3.1不同名是按實際名調用,出現同名是,子類用本類中的方法。

3.2同名時,可使用super.同名稱();去調用父類中的方法。

案例演示如圖6所示:

Java面向對象之this和super在繼承中的應用及如何實現父、子類

圖6

感謝支持,我是小區日記本,喜歡點關注。每天根據小編的學習,持續分享學習的筆記與心得。

案例代碼截圖僅包含部分,小編已整理了全部代碼並分享,可免費領取,私信回覆2個字:代碼


分享到:


相關文章: