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
