類的建構函式繼承day01
阿新 • • 發佈:2018-11-10
下面代買的執行結果是什麼?
1 public class FatherClass { 2 public FatherClass(){ 3 System.out.println(100); 4 } 5 public FatherClass(int age){ 6 System.out.println(age); 7 } 8 } 9 10 11 12 public class SonClass extends FatherClass { 13 publicSonClass(){ 14 15 } 16 public SonClass(int c){ 17 System.out.println(1234); 18 } 19 public static void main(String[] args) { 20 SonClass s=new SonClass(66); 21 } 22 }
執行的結果是 100
1234
分析 : SonClass s=new SonClass(66); 在執行這句的時候,呼叫
public SonClass(int c){ System.out.println(1234); 系統會先呼叫父類五引數的建構函式(super()) 在這個建構函式中等價於 } public SonClass(int c){ super(); 必須第一行,否則編譯不通過 System.out.println(1234); } 所以結果是 100 1234 在建立子類物件的時候,JAVA 虛擬機器首先會執行父類的構造方法,然後再執行子類的構造方法。在多級繼承的情況下,,將從繼承樹的最上層的父類開始,依次執行各個類的構造範法官,這可以保證子
類物件從所有直接或者間接父類中繼承的例項變數都被正確的初始化。
如果子類的建構函式這樣寫
public SonClass(int c){
super(22); 必須第一行,否則編譯不通過 顯示的呼叫了有殘數的 super 之後,系統不在呼叫無引數的 super
System.out.println(1234);
}
總結一、
1. JAVA 繼承中對建構函式不是繼承的,只是呼叫(隱式的或者顯示的呼叫)
2. 建構函式不能被繼承,只是呼叫而已。
3. 如果父類中沒有無引數的構造器,建立子類的時候,不能編譯,除非在建構函式的程式碼第一行,必須是第一行,顯示的呼叫無引數的構造器。
4. 如果不顯示的呼叫父類有引數的構造器,系統會預設呼叫父類的引數的構造器,但是父類中沒有無引數的構造器,那也就不能呼叫了,所以編譯器無法通過。
總結二、
創造有引數的構造器後,系統就不會預設無引數的構造器,如果沒有任何建構函式,系統會預設一個無引數的構造器。