首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 繼承機制選擇題解析:parent child 輸出結果詳解

     編輯:程式設計疑難解答

題目還原

根據圖片內容,題目考察 Java 繼承下的建構子呼叫順序與欄位初始化機制。

正確答案:parent child

程式碼分析


class Parent {
    public String name;
    public Parent(String pName) {
        this.name = pName;
    }
}

class Test extends Parent {
    public Test(String Name) {
        super("kitty");  // 1. 先呼叫父類建構子
        name = "hello";  // 2. 再執行子類建構子內容
    }
}

執行流程詳解

  1. new Test("參數") 呼叫子類建構子
  2. 子類建構子第一行 隱含或顯式呼叫 super(...)
  3. 父類建構子執行:this.name = "kitty" → 輸出 parent
  4. 返回子類建構子繼續執行:name = "hello" → 輸出 child

關鍵知識點總結

知識點說明
建構子鏈子類建構子必須先完成父類初始化,super() 必須是第一行敘述
欄位遮蔽子類同名欄位會遮蔽父類欄位,但父類建構子只能存取父類欄位
初始化順序靜態區塊 → 父類實例初始化 → 父類建構子 → 子類實例初始化 → 子類建構子
多型與建構子建構子不參與多型,無法覆寫,只能透過 super 呼叫

常見誤區

  • ❌ 以為子類建構子會「覆寫」父類建構子
  • ❌ 忽略 super() 隱含呼叫,導致父類無參建構子不存在時編譯錯誤
  • ❌ 混淆欄位初始化順序與建構子執行順序

延伸練習


class A { 
    String s = "A欄位"; 
    A() { print(s); } 
    void print(String x) { System.out.println(x); }
}
class B extends A {
    String s = "B欄位";
    B() { print(s); }
    void print(String x) { System.out.println("B:" + x); }
}
new B();  // 輸出什麼?
點擊查看答案

輸出:A欄位 → B:B欄位
原因:父類建構子呼叫的是被覆寫的 print 方法(多型),但存取的是父類欄位 s;子類建構子同樣呼叫覆寫方法,存取子類欄位。

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