java中構造方法的理解,super()與構造方法,無參,有參構造方法,this()與構造方法。
一、為什麼要引入構造方法。
當建立物件的時候需要對屬性值初始化,構造方法,即物件建立時要執行的方法。
要求在例項化的同時,就指定好name,和age的值。這就要用到構造方法。又叫做構造器Constructor.
二、構造方法的定義格式
構造方法在new的時候自動執行。且只執行一次。new一次執行一次。
注意:每個類都有構造方法,即使不寫也有,編譯時javac會自動檢查類是否有構造方法,如果有,就執行,沒有就自動新增一個。但是,如果你寫了一個帶有引數的構造方法,而沒有寫無參構造方法,就會報錯。
如上圖:如果不寫無參構造方法,就會報錯。同時也證明了,構造方法是可以過載的。
三、構造方法的過載
如果構造方法發生了過載,就要建立無參構造方法,否則會報錯。
那麼在建立物件時,需要通過構造方法來建立物件的,上圖說了,只有構造方法結束了,整個物件才算建立完成。因此可以通過不同的構造方法來建立物件。如圖:分別用兩種構造方法來建立物件。
分析:無參構造方法和例項化之間的關係。
無參構造方法,可以不寫,但是最終都會有的,跟是否例項化無關。但是如果許可權是private,那麼其他類就無法通過無參構造方法例項化,就會報錯。如圖所示:
四、構造方法和其他方法的區別
1、構造方法只能執行一次,其他方法執行次數沒有限制。
2、定義格式不同。構造方法沒有返回值,必須與類名相同。
五、this在構造方法之間的呼叫
首先說一下this的用處。
1、this.區分區域性變數和成員變數同名情況。
2、this用在構造方法中,用於呼叫了有參構造方法。
格式: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(帶參)顯示的呼叫父類的構造方法。
super是父類物件引用,this是本類物件引用。super(),this()都必須放在構造方法的第一行,super()和this()絕不能一塊用,super(),this()無參時可以省略不寫。
上圖很重要。終於明白了為什麼有的類沒有在有引數建構函式的情況下,沒有寫無參也可以。問題的關鍵是物件是有參還是無參來構建的。若用無參物件構建,那麼類中必須有無參建構函式,(在類中含有有參建構函式的情況下。)
快捷鍵:ctrl+T 用於開啟繼承關係圖。
注意:若不確定該類是否是抽象類,可以這樣想,該類的方法在做什麼?如果方法內容不明確,就是抽象類。