首先咱們看看下面的代碼: 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
這樣的報錯是由於,編譯器在編譯的時候,若是子類 的構造器沒有顯示的調用super(),編譯器也會默認在子類構造器中插入super(),但此時父類並無無參構造器,因此上面的代碼就報錯了。解決方案有不少種:
1. 在父類中聲明一個無參構造函數
2.之類的構造器中調用super(value)
3.去掉父類中的構造函數,這樣編譯器會自動的爲父類加一個無參構造函數 設計
總之,子類的構造器必定會調用父類的構造器,無論是顯示調用仍是隱式的調用,父類裏面必定要定義相應的構造函數。 code