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所示:
2、注意事項:super(…)或者this(…)必須出現在構造方法的第一條語句上。
super();指向訪問父類的構造方法;
this();指向訪問本類中的構造方法(子類)。
案例演示如圖2、3所示:
面試題1:根據程序代碼判斷輸出結果?
程序代碼演示如圖4所示:
面試題2:根據程序代碼判斷輸出結果?
程序代碼演示如圖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所示:
感謝支持,我是小區日記本,喜歡點關注。每天根據小編的學習,持續分享學習的筆記與心得。
案例代碼截圖僅包含部分,小編已整理了全部代碼並分享,可免費領取,私信回覆2個字:代碼
閱讀更多 小區日記本 的文章