首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 每日一題:繼承與 toString() 覆寫——BigDog 輸出什麼?

     編輯:Java 綜合教學

Java 每日一題:繼承與 toString() 覆寫——BigDog 輸出什麼?

題目來源:【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:黑色

執行流程

  1. new BigDog("大黑狗", "黑色") 調用 BigDog 構造器。
  2. BigDog 構造器未顯式調用 super(name),隱式調用 Dog() 無參構造器(但 Dog 類未定義無參構造器,編譯器不會自動生成,因為已定義有參構造器)。
  3. 編譯錯誤? 實際上代碼能編譯通過,原因: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(參數),否則編譯失敗。
  • 字段初始化順序:父類靜態 → 子類靜態 → 父類實例字段/塊 → 父類構造器 → 子類實例字段/塊 → 子類構造器。
  • toString() 覆寫:子類完全覆蓋父類實現,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)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved