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

Java 繼承機制深度解析:屬性隱藏與方法覆蓋的本質區別

     編輯:Java 相關知識

核心結論

屬性綁定到類型(靜態綁定),方法綁定到對象(動態綁定)。

代碼驗證

public class FieldDemo {
    public static void main(String[] args) {
        Student t = new Student("Jack");
        Person p = t; // 父類引用指向子類對象
        System.out.println(t.name + "," + p.name);      // Jack,Rose
        System.out.println(t.getName() + "," + p.getName()); // Jack,Jack
    }
}

class Person {
    String name;
    public String getName() { return this.name; }
}

class Student extends Person {
    String name; // 與父類同名屬性
    public Student(String name) {
        this.name = name;      // 子類屬性
        super.name = "Rose";   // 父類屬性
    }
    @Override
    public String getName() { return this.name; }
}

輸出解析

  • t.name:編譯類型 Student,訪問子類屬性 → Jack。
  • p.name:編譯類型 Person,訪問父類屬性 → Rose(屬性隱藏,非覆蓋)。
  • t.getName() / p.getName():運行時對象均為 Student,動態分派調用子類覆蓋方法 → Jack、Jack。

原理深度解析

屬性隱藏

  • 子類聲明與父類同名屬性,不會覆蓋父類屬性,而是隱藏它。
  • 訪問哪個屬性取決於引用的編譯時類型(靜態綁定)。
  • 可通過 super.field 顯式訪問父類屬性。

方法覆蓋

  • 子類方法簽名與父類相同(返回類型兼容),構成覆蓋。
  • 調用哪個方法取決於對象的實際運行時類型(動態綁定/多態)。
  • @Override 註解可編譯期檢查覆蓋正確性。

最佳實踐

  1. 避免屬性同名:開發中子類不應聲明與父類同名屬性,防止混淆。
  2. 優先使用 private 封裝屬性,提供 getter/setter,子類覆蓋方法而非直接訪問屬性。
  3. 善用 @Override 確保覆蓋意圖被編譯器驗證。

總結

Java 繼承中「屬性看引用類型,方法看對象類型」是多態機制的基石。理解靜態/動態綁定區別,能避免 90% 繼承相關的隱性 Bug。

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