Java——實例構造方法:super()、this()

1.實例構造方法的注意事項:

①Java的實例構造方法的方法名必須與類名完全相匹配。

②無返回類型。

③如果在類中沒有定義實例構造方法,系統會默認創造一個無參數的實例構造方法,只要在類中定義自己的實例構造方法,系統便不會再默認創造無參數的實例構造方法。

④super()、this()實例構造方法調用語句必須是實例構造方法體中的第一條語句。

⑤實力構造方法不能被繼承。(就如同父親的出生和你的出生是不能繼承的一樣)

⑥實例構造方法是實方法、實調用、靜態綁定。

下面,我來爲大家舉幾個例子吧!!!👇👇👇

 

Example 1:(自動添加默認的無實現代碼的無參實例構造方法)

一個類中如果沒有定義任何實例構造方法,那麼,編譯器會自動添加一個默認的無參實例構造方法,該默認的無參實例構造方法無實現代碼。具體的代碼如下:👇👇👇

class SuperClass {
	public int a;
        /*public SuperClass() {//編譯器添加的默認的無實現代碼的無參實例構造方法
            super();
        }*/
}
public class SubClass extends SuperClass {
	int b;
	public SubClass() {
                //super();
		System.out.println("調用子類無參構造方法...");
		b=30;
	}
	public SubClass(int n) {
                //super();
		System.out.println("調用子類有參構造方法...");
		b=n;
	}
	public static void main(String[] args) {
		SubClass obj=new SubClass();//實例化一個子類對象
		System.out.println("a="+obj.a+",b="+obj.b);//輸出子類中的屬性值
	}
}

代碼中帶有註釋的部分是編譯之後,新生成的內容,也就是在類SuperClass中並沒有定義實例構造方法,所以此時編譯器會自動添加一個。而在子類中的兩個方法裏,並沒有父類的構造方法,所以此時編譯後會在第一行添加父類構造方法super()。下面,我們來看一下程序運行結果:👇👇👇

這裏,首先通過語句:SubClass obj=new SubClass(); 去 public SubClass() 中執行第一行,先 super() 執行父類無參構造方法,而父類中是一個無代碼實現的無參實例構造方法,所以並沒有什麼改變和輸出,之後回到 public SubClass() 中執行第二行,進行輸出,最後將b的值修改爲30,因爲a未賦值,所以爲0,也就是上圖的運行結果!!!

 

Example 2:(超類有無參構造方法)

class SuperClass {
	public int a;
	public SuperClass() {
                //super();
		System.out.println("調用父類無參構造方法...");
		a=10;
	}
	public SuperClass(int m) {
                //super();
		System.out.println("調用父類有參構造方法...");
		a=m;
	}
}
public class SubClass extends SuperClass {
	int b;
	public SubClass() {
                //super();
		System.out.println("調用子類無參構造方法...");
		b=30;
	}
	public SubClass(int n) {
                //super();
		System.out.println("調用子類有參構造方法...");
		b=n;
	}
	public static void main(String[] args) {
		SubClass obj=new SubClass();//實例化一個子類對象
		System.out.println("a="+obj.a+",b="+obj.b);//輸出子類中的屬性值
	}
}

這個例子中,編譯器編譯後:編譯器不會添加默認的無實現代碼的無參實例構造函數。

如果子類的構造方法沒有顯示地調用超類的構造方法 super(…)、本類的構造方法 this(…),則編譯器將在子類構造方法體中的第一條語句自動添加調用超類無參構造方法 super() 語句。

這裏,首先通過語句:SubClass obj=new SubClass(); 去 public SubClass() 中執行第一行,先 super() 執行父類無參構造方法,而父類的無參構造方法中也有一個 super() ,這裏會往Java中的Object類中走(這裏不做詳細解釋),在父類無參構造方法中,先進行輸出,再把a賦值爲10,之後回到 public SubClass() 中執行第二行,進行輸出,最後將b的值修改爲30,也就是如下圖的運行結果!!!👇👇👇

 

Example 3:(超類沒有無參構造方法)

class SuperClass {
	public int a;
	public SuperClass(int m) {
		System.out.println("調用父類有參構造方法...");
		a=m;
	}
}
public class SubClass extends SuperClass {
	int b;
	public SubClass() {
		System.out.println("調用子類無參構造方法...");
		b=30;
	}
	public SubClass(int n) {
		System.out.println("調用子類有參構造方法...");
		b=n;
	}
	public static void main(String[] args) {
		SubClass obj=new SubClass();//實例化一個子類對象
		System.out.println("a="+obj.a+",b="+obj.b);//輸出子類中的屬性值
	}
}

這個例子中,編譯器編譯之後會報錯!!! 因爲子類的構造方法中要自動添加 super(); 語句,但是超類中沒有無參構造方法可以用來調用。

 

Example 4:(在子類構造方法體中,使用 super(...)調用超類構造方法的語句必須是子類構造方法體中的第一條語句)

class SuperClass {
	public int a;
	public SuperClass() {
                //super();
		System.out.println("調用父類無參構造方法...");
		a=10;
	}
	public SuperClass(int m) {
                //super();
		System.out.println("調用父類有參構造方法...");
		a=m;
	}
}
public class SubClass extends SuperClass {
	int b;
	public SubClass() {
		super(20);
		System.out.println("調用子類無參構造方法...");
		b=30;
	}
	public SubClass(int n) {
		super(20);
		System.out.println("調用子類有參構造方法...");
		b=n;
	}
	public static void main(String[] args) {
		SubClass obj=new SubClass();//實例化一個子類對象
		System.out.println("a="+obj.a+",b="+obj.b);//輸出子類中的屬性值
	}
}

這個例子中,首先通過語句:SubClass obj=new SubClass(); 去 public SubClass() 中執行第一行,先 super(20) 執行父類有參構造方法,而父類的有參構造方法中也有一個 super(),這裏會往Java中的Object類中走(這裏不做詳細解釋),在父類有參構造方法中,先進行輸出,再把a賦值爲20,之後回到 public SubClass() 中執行第二行,進行輸出,最後將b的值修改爲30,也就是如下圖的運行結果!!!👇👇👇

 

Example 5:(在本類實例構造方法中,使用 this(..)調用本類其它實例構造方法的語句必須是本類實例構造方法的第一條語句)

class SuperClass {
	public int a;
	public SuperClass() {
                //super();
		System.out.println("調用父類無參構造方法...");
		a=10;
	}
	public SuperClass(int m) {
                //super();
		System.out.println("調用父類有參構造方法...");
		a=m;
	}
}
public class SubClass extends SuperClass {
	int b;
	public SubClass() {
		this(40);
		System.out.println("調用子類無參構造方法...");
		b=30;
	}
	public SubClass(int n) {
		super(20);
		System.out.println("調用子類有參構造方法...");
		b=n;
	}
	public static void main(String[] args) {
		SubClass obj=new SubClass();//實例化一個子類對象
		System.out.println("a="+obj.a+",b="+obj.b);//輸出子類中的屬性值
	}
}

這個例子中,首先通過語句:SubClass obj=new SubClass(); 去 public SubClass() 中執行第一行,先 this(40) 執行本類的有參構造方法,而在本類的有參構造方法中,先 super(20) 執行父類的有參構造方法,在父類的有參構造方法中也有一個 super(),這裏會往Java中的Object類中走(這裏不做詳細解釋),在父類有參構造方法中,先進行輸出,再把a賦值爲20,之後回到 public SubClass(int n) 中執行第二行,進行輸出,之後將b的值修改爲40,將本類的有參構造方法執行完畢之後,再回到 public SubClass() 中繼續執行本類的無參構造方法的第二行,進行輸出,最後將b的值修改爲30,也就是如下圖的運行結果!!!👇👇👇

 

2.實例構造方法的調用過程 

實例構造方法的執行順序:Object(…) → SuperClass (…)  → SubClass (…)

實例構造方法的調用過程:SubClass (…) → SuperClass (…) → Object(…)


那麼,以上就是博主分享給大家的有關Java語言中的實例構造方法:super()、this()的理解與使用,希望對大家學習Java有所幫助。如果博文中有表達不慎的地方或是錯誤,還請大佬指出。感謝感謝!!!😀😀😀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章