參考文章:
https://blog.csdn.net/qq_33322074/article/details/86030836
https://blog.csdn.net/HD243608836/article/details/81567101
https://blog.csdn.net/zhaozhirongfree1111/article/details/77962184
構造方法在new的時候自動執行。且只執行一次。new一次執行一次
每個類都有構造方法,即使不寫也有,編譯時javac會自動檢查類是否有構造方法,如果有,就執行,沒有就自動添加一個
如果父類有含參構造方法,則子類也必須添加含參構造方法
如果父類沒有含參構造方法,子類無需添加構造方法
this在構造方法之間的應用
super在構造方法中的應用
首先要明白super關鍵字的作用:
1、super是調用父類的成員方法或成員變量。
但是還有一個問題:.
也就是說子類對象中,父類的構造方法會先執行。那么為什么要執行父類構造方法呢?
假設,創建了一個父類,含有一個成員屬性a=1;含有一個構造方法,將a=5;。因為如果子類創建的對象調用父類的成員變量a時,在不添加super()時,會得到a=1;如果添加super()就會得到a=5;我們都知道,構造方法在創建對象時執行,a應該等於5,故如果不調用super()就會得到錯誤的值。
2、super()在構造方法中是調用父類構造方法的意思。
當創建子類對象時,父類對象先進內存。這樣子類才能自動擁有父類的成員。
3、子類的構造器,無論重載多少個,第一行必須是super();當你不寫時表示空參super();是否寫參數,要根據父類決定,父類有參數,那么子類的super()必須有參數。
4、構造方法無法繼承,自然也沒有重寫這個概念。
5、super()語句必須是構造方法的第一行代碼。
總結一下:其實這些內容說白了,就是在說一句話。
super是父類對象引用,this是本類對象引用。super(),this()都必須放在構造方法的第一行,super()和this()絕不能一塊用,super(),this()無參時可以省略不寫。
會報錯:
快捷鍵:ctrl+T 用於打開繼承關系圖。
子類的構造函數 必須要 super() 嗎?
不是必須,是自動
必須的情況:————指明調用哪個 含參構造函數
public class Father { public String name; public Father(String name) { this.name = name; } } public class Son extends Father{ public Son(String name) { super(name);//必須調用,否則他會默認調用父類的無參構造函數,而父類的無參構造函數已經被有參的覆蓋,所以找不到 }
this()只能用在構造函數中,且它必須是第一行語句?
1.在構造函數中,如果你不指定構造器之間的調用關系,那么編譯器會給你加上super();目的是在初始化當前對象時,先保證了父類對象先初始化。所以,你指定了構造函數間的調用,那么this()必須在第一行,以保證在執行任何動作前,對象已經完成了初始化。
構造函數只能被構造函數調用,因為對象只會初始化一次。
2.解答這個問題,首先要明確一下構造方法和普通成員方法的區別。
類似this()和super()這樣的方法被稱為構造方法,顧名思義,他的作用就是在JVM堆中構建出一個指定類型的對象,如果你調用了兩個這種形式的方法,豈不是代表着構建出了兩個對象。
同理,為了避免構建出兩個對象這種問題的出現,Java在編譯時對這種情況做了強校驗,用戶不能再同一個方法內調用多次this()或super(),同時為了避免對對象本身進行操作時,對象本身還未構建成功(也就找不到對應對象),所以對this()或super()的調用只能在構造方法中的第一行實現,防止異常。
在普通的成員方法中,如果調用super()或者this(),你是想要重新創建一個對象嗎?抱歉Java為了保證自身對象的合理性,不允許你做這樣的操作。
this()和super()為構造方法:
作用是在JVM堆中構建出一個對象
- 因此避免多次創建對象,同一個方法內只能調用一次this()或super()。
- 同時為了避免操作對象時對象還未構建成功,需要this()和super()的調用在第一行實現【以此來創建對象】,防止異常。