super构造方法为什么给子类赋值_【Java学习 | Javase】super
整理自:動力節點基礎講義
super
概述
嚴格來說,super其實并不是一個引用,它只是一個關鍵字,super代表了當前對象中從父類繼承過來的那部分特征。換句話說,super其實是this的一部分,從父類繼承過來的屬性和方法,在內存方面使用了super關鍵字標記
super和this都可以使用在實例方法中
super不能使用在靜態方法中,因為super代表了當前對象上的父類型特征,靜態方法中沒有this,肯定也不能使用super
super使用在構造方法
”super(實參列表);“是通過當前的構造方法調用父類的構造方法
”super(實參列表);“調用父類構造方法時,從本質上說并不是創建一個“獨立的父類對象”,而是為了完成當前對象的父類型特征的初始化操作,也是為了代碼復用,使用用法見【Java學習 | Javase】繼承與多態
super使用在實例方法
當父類中有該實例變量,子類中又重新定義了同名的實例變量,如果想在子類中訪問父類的實例變量,super不能省略,因為此時父類的實例變量被隱藏了,實例方法亦是如此
總結:父類和子類中有同名實例變量或者同名實例方法,想在子類中訪問父類中的實例變量或實例方法,則super不能省略,其他情況都可以省略
代碼展示
1、super并不是一個單獨的引用
通過測試,可以看出this是單獨使用的引用,而super無法輸出編譯器提示要輸出"super.xxx",可見super不是指向某個獨立的對象,也不是保存某個地址
代碼
public?class?Test{????public?static?void?main(String[]?args)?{???
????????H1?h?=?new?H2();
????????h.doSome();
????}
}
class?H1{
????public?void?doSome()?{???
????????System.out.println(this);
????????System.out.println(super);
????}
}
輸出結果
????錯誤:?需要'.'????????System.out.println(super);
????????????????????????????????^
????錯誤:?需要')'
????????System.out.println(super);
?????????????????????????????????^
????錯誤:?需要';'
????????System.out.println(super);
??????????????????????????????????^
????錯誤:?解析時已到達文件結尾
}
?^
4?個錯誤
2、super不能在靜態方法中使用
如果是寫成System.out.println(super),那么編譯器會報出上面的錯誤而不是現在的錯誤
代碼
public?class?Test{????public?static?void?main(String[]?args)?{???
????????System.out.println(this);
????????System.out.println(super.toString());
????}
}
輸出結果
錯誤:?無法從靜態上下文中引用非靜態?變量?this????????System.out.println(this);
???????????????????????????^
錯誤:?無法從靜態上下文中引用非靜態?變量?super
????????System.out.println(super.toString());
???????????????????????????^
3、靜態代碼塊、靜態變量、實例變量的綜合測試
分析
靜態變量有順序,故先初始化k,然后依次到t1、t2,由于實例變量的初始化在創建對象時執行,故t1和t2創建之前會先執行j。然后到i、n,接著到靜態代碼塊,再然后到main方法。需要注意的是,執行t1、t2時由于i、n沒有初始化(沒執行到),故是缺省默認值
代碼
public?class?Test{????public?static?int?k?=?0;
????public?static?Test?t1?=?new?Test("t1");
????public?static?Test?t2?=?new?Test("t2");
????public?static?int?i?=?print("i");
????public?static?int?n?=?99;
????public?int?j?=?print("j");
????static{
????????System.out.println("靜態塊");??
????}
????public?Test(String?str){
????????System.out.println((++k)+":"+str+"??i?=?"+i+"???n?=?"+n);
????????++i;
????????++n;
????}
????public?static?int?print(String?str){
????????System.out.println((++k)+":"+str+"??i?=?"+i+"???n?=?"+n);
????????++n;
????????return?++i;
????}
????public?static?void?main(String[]?args)?{???
????????new?Test("init");
????}
}
輸出結果
1:j?????i?=?0???n?=?02:t1????i?=?1???n?=?1
3:j?????i?=?2???n?=?2
4:t2????i?=?3???n?=?3
5:i?????i?=?4???n?=?4
靜態塊
6:j?????i?=?5???n?=?99
7:init??i?=?6???n?=?100??????
學習沒有捷徑,能力增強自信,樂觀有益人生!
總結
以上是生活随笔為你收集整理的super构造方法为什么给子类赋值_【Java学习 | Javase】super的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: python短视频自动制作_Python
 - 下一篇: 怎么检查网站的死链(网站死链查询检测方法