題目來源:【Java每日一題】20170116
package Jan2017;
public class Ques0116 {
public static void main(String[] args) {
System.out.println(new BigDog("大黑狗", "黑色"));
}
}
class Dog {
String name;
public Dog(String name) {
super();
this.name = name;
}
public String toString() {
return "name:" + name;
}
}
class BigDog extends Dog {
String color;
public BigDog(String name, String color) {
this.name = name; // 直接賦值父類字段
this.color = color;
}
@Override
public String toString() {
return "name:" + name + ", color:" + color;
}
}
主程序輸出結果是什麼?
name:大黑狗, color:黑色
new BigDog("大黑狗", "黑色") 調用 BigDog 構造器。BigDog 構造器未顯式調用 super(name),隱式調用 Dog() 無參構造器(但 Dog 類未定義無參構造器,編譯器不會自動生成,因為已定義有參構造器)。BigDog 構造器第一行隱式 super() 調用 Dog(),但 Dog 類只有 Dog(String),編譯應報錯:「Implicit super constructor Dog() is undefined. Must explicitly invoke another constructor」原題代碼存在編譯錯誤。若修正為:
class BigDog extends Dog {
String color;
public BigDog(String name, String color) {
super(name); // 顯式調用父類有參構造器
this.color = color;
}
@Override
public String toString() {
return "name:" + name + ", color:" + color;
}
}
則輸出 name:大黑狗, color:黑色。
super(...) 或 this(...);若省略,隱式 super() 調用父類無參構造器。super(參數),否則編譯失敗。System.out.println(obj) 自動調用 obj.toString()。class A { A() { print(); } void print() {} }
class B extends A { int x = 1; void print() { System.out.println(x); } }
new B(); // 輸出 0 而非 1!原因:B 構造器執行前,x 尚未初始化(默認 0)。
注意構造器中調用可覆寫方法的風險(見 Effective Java 條目 19)。