1. 如果在類中你提供了其他有參的構造器,則編譯器不會提供默認的無參構造器。
class Animal { Animal(String name) { } public static void main(String[] args){ Animal a = new Animal(); } }
該段代碼編譯不會通過,報錯信息如下:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: <span style="white-space:pre"> </span>The constructor Animal() is undefined
2. 如果在類中你沒有提供任何構造器,則編譯器會提供一個默認的無參構造器。
class Animal { public static void main(String[] args){ Animal a = new Animal(); } }
該段代碼則會順利編譯通過。
3. 如果你提供了一個構造器,你無須手動添加super()到你的構造器,編譯器會默認添加。
class Animal { Animal (){ System.out.println("----Animal無參構造器-----"); } } class Horse extends Animal { Horse() { // super(); //此行代碼有與沒有都是一樣的 System.out.println("----Horse無參構造器-----"); } Horse(int a) { // super(); //此行代碼有與沒有都是一樣的 System.out.println("----Horse有參構造器-----"); } public static void main(String[] args){ Horse a = new Horse(); Horse b = new Horse(3); } }
打印信息如下:
----Animal無參構造器----- ----Horse無參構造器----- ----Animal無參構造器----- ----Horse有參構造器-----
4. 如果父類未提供無參構造器,子類會報錯:
class Animal { Animal (int a){ System.out.println("----Animal有參構造器-----"); } } class Horse extends Animal { Horse() { System.out.println("----Horse無參構造器-----"); } public static void main(String[] args){ Horse a = new Horse(); } }
該代碼不會編譯通過,報錯如下:
Implicit super constructor Animal() is undefined. Must explicitly invoke another constructor
5. 如果構造器中添加了this引用該類的其他構造器,或者添加了super()調用父類構造器,this和super必須在構造器第一行,this引用其他構造器和super()語句不會同時出現
class Animal { Animal (){ System.out.println("----Animal無參構造器-----"); } } class Horse extends Animal { String name; Horse() { System.out.println("----Horse無參構造器-----"); this("馬"); //提示錯誤, } Horse(String name){ this.name = name; } }
具體錯誤提示為:Constructor call must be the first statement in a constructor
6. 如果構造器中添加了this引用該類的其他構造器,或者添加了super()調用父類構造器,如果this和super中有參數,則只能是靜態的方法和靜態變量或常量
class Animal { Animal (){ System.out.println("----Animal無參構造器-----"); } } class Horse extends Animal { String name; Horse() { this(getRondomName());<span style="font-family:Arial, Helvetica, sans-serif;"> //代碼段A</span> System.out.println("----Horse無參構造器-----"); } Horse(String name){ System.out.println("----Horse有參構造器-----"); //代碼段B this.name = name; } static String getRondomName(){ int x = (int) (Math.random() * 5); String name = new String[] {"馬", "豬", "牛", "羊","貓"}[x]; return name; } public static void main(String[] args){ Horse a = new Horse(); } }
打印結果如下:
----Animal無參構造器----- ----Horse有參構造器----- ----Horse無參構造器-----
如果調用了this引用其他構造器,那么super()將不會在該構造器中調用,所以super()將在代碼段B前面一行被調用,而不是在代碼段A前面一行。
如果把getRondomName方法前的static去掉,則會提示錯誤:Cannot refer to an instance method while explicitly invoking a constructor