java的無參構造器和super()
阿新 • • 發佈:2018-12-30
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