屬性綁定到類型(靜態綁定),方法綁定到對象(動態綁定)。
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 註解可編譯期檢查覆蓋正確性。private 封裝屬性,提供 getter/setter,子類覆蓋方法而非直接訪問屬性。@Override 確保覆蓋意圖被編譯器驗證。Java 繼承中「屬性看引用類型,方法看對象類型」是多態機制的基石。理解靜態/動態綁定區別,能避免 90% 繼承相關的隱性 Bug。