一、構造函數的作用
- 創建類的對象,只有對象才能調用一個類中的方法和屬性
二、在有繼承關系的類中,創建子類對象,初始化的順序
-
先父類構造 —>后子類構造
-
為什么父類構造會被調用?因為有繼承關系,子類創建了對象會用到父類的屬性方法,所以父類也要初始化,不然你繼承父類而不用父類的屬性和方法,那繼承還有什么意義。
-
怎么調用父類構造的?在子類構造方法第一行默認調用super(),這意思就是調用父類的空參數構造函數,super()你加了系統不加,你不加系統默認有一個
三、空參數構造函數必須有(關鍵)
+在一個類中,肯定會有構造函數,而且肯定會有空參構造函數,總的來說就是,1、只有空參構造 2、空參構造以及其他重載的多個有參構造
- 如果你沒寫任何構造,系統默認添加空參構造,如果你寫了有參構造,那么你必須把那個空參構造也顯示的添加上
四、this() super()
+ this()調用的是本類中的空參構造,本類空參構造中其實也隱含super(),所以也會調用到父類空參構造:有參構造—this()—本類無參構造—spuer()—父類無參構造—父類被初始化
-
super() 調用父類空參數構造方法,
-
super(參數一,參數二,….),調用父類指定參數個數的構造函數
五、什么時候必須在構造函數里面調用super(參數)
- 如果你創建子類對象 同時想調用父類非空參數的構造函數,那么就得在第一行加上super(參數個數):這種情況一般沒什么意義
六:綜合來說:我的理解
super()不加,系統默認會加上,super()的作用就是調用父類空參數構造,初始化父類,初始化了父類,子類才能通過創建的子類對象調用父類的屬性和方法,這就是super()的意義。
class A {
public A(){
System.out.println("父類無參構造");
}
public A(String a){
//這里默認調用空參構造,所以必須定義空參構造
System.out.println("父類有參構造");
}
}
class B extends A{
B(){
System.out.println("子類無參構造");
}
public B(String a){
this();
System.out.println("子類有參構造");
}
}
public class test {
public static void main(String[] args) {
// A a1=new A();
// A a2=new A("啦啦啦");
//B b1 = new B();
B b2 = new B("呃呃呃");
}
}