Java 構造器的祕密

1. 子類實例化也調用父類的構造函數

首先咱們看看下面的代碼: java

class Super {
    String s;
 
    public Super(){
    	System.out.println("Super");
    }
}
 
class Sub extends Super {
 
    public Sub(){
    	System.out.println("Sub");
    }
 
    public static void main(String[] args){
    	Sub s = new Sub();
    }
}



後臺結果是:

Super
Sub
函數


在上面的代碼中,其實子類並無調用Super()這個方法,可是子類實例化的時候仍是調用了父類的構造函數。這是由於,若是子類的構造器沒有顯示的調用super()這個方法,編譯器會自動插入super()這條語句到子類構造器中。這樣設計就使子類的實例化必須調用父類的構造函數,由於父類裏面若是有私有的成員變量子類是沒法察覺的,仍是須要用父類的構造器初始化父類的私有成員變量。 spa

2. 編譯報錯:父類構造器沒有定義

這樣的報錯是由於,編譯器在編譯的時候,若是子類 的構造器沒有顯示的調用super(),編譯器也會默認在子類構造器中插入super(),但此時父類並無無參構造器,因此上面的代碼就報錯了。解決方案有不少種:
1. 在父類中聲明一個無參構造函數
2.之類的構造器中調用super(value)
3.去掉父類中的構造函數,這樣編譯器會自動的爲父類加一個無參構造函數 設計

3. 總結

總之,子類的構造器必定會調用父類的構造器,無論是顯示調用仍是隱式的調用,父類裏面必定要定義相應的構造函數。 code

文章來源: http://www.programcreek.com/2013/04/what-are-the-frequently-asked-questions-about-constructors-in-java/ get

相關文章
相關標籤/搜索