java中子類繼承父類時是否繼承構造函數

來源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.htmlhtml

---------------------java

java繼承中對構造函數是不繼承的,只是調用(隱式或顯式)。函數

如下是例子:spa

 public class FatherClass {

 public FatherClass() {
       System.out.println(100);
 }
htm

 public FatherClass(int age) {
      System.out.println(age);
 }
對象

}blog

 

public class SonClass extends FatherClass{繼承

        public SonClass() {
         }

        
public SonClass(int c) {
                 System.out.println(1234);
        }
   
 public static void main(String[] args) {
get

  SonClass s = new SonClass(66);
 
 }
}
虛擬機

編譯後執行結果以下是什麼呢?

分析:SonClass s = new SonClass(66);執行這句時,調用

 public SonClass(int c) {
                 System.out.println(1234);//系統會自動先調用父類的無參構造函數(super())
        }

 

在這個構造函數中,等價於

 public SonClass(int c) {

                super();//必須是第1行,不然不能編譯
                 System.out.println(1234);
        }

因此結果是    100
             
1234

在建立子類的對象時,Java虛擬機首先執行父類的構造方法,而後再執行子類的構造方法。在多級繼承的狀況下,將從繼承樹的最上層的父類開始,依次執行各個類的構造方法,這能夠保證子類對象從全部直接或間接父類中繼承的實例變量都被正確地初始化。

3.若是子類構造函數是這樣寫的

public SonClass(int c) {

                super(22);//必須是第1行,不然不能編譯
                          
//顯式調用了super後,系統就再也不調用無參的super()了;
                 System.out.println(1234);
        }

執行結果是   22
            1234

總結1:構造函數不能繼承,只是調用而已。

若是父類沒有無參構造函數

建立子類時,不能編譯,除非在構造函數代碼體中第一行,必須是第一行顯式調用父類有參構造函數

以下:

SonClass (){

super(777);//顯示調用父類有參構造函數

System.out.println(66);

}

若是不顯示調用父類有參構造函數,系統會默認調用父類無參構造函數super();

可是父類中沒有無參構造函數,那它不是不能調用了。因此編譯就沒法經過了。

總結2:建立有參構造函數後,系統就再也不有默認無參構造函數。

若是沒有任何構造函數,系統會默認有一個無參構造函數。

相關文章
相關標籤/搜索