繼承(Inheritance)建立類之間的 is-a 關係,子類自動擁有父類非私有成員,實現代碼復用。Java 採用單繼承模型:一個類僅能有一個直接父類(默認繼承 Object)。
class Animal { /* 父類 */ }
class Dog extends Animal { /* 子類 */ } // 語法:class 子類 extends 父類
Eclipse/IDEA 新建類時可直接指定 Superclass,IDE 自動生成 extends 子句與構造器調用 super()。
子類重寫父類方法需滿足「兩同兩小一大」:
@Override 註解編譯期校驗,防止誤寫成重載。私有方法、靜態方法、final 方法、構造器均不可重寫。
關鍵點:子類構造器首行隱式/顯式調用 super(...);若父類無無參構造器,子類必須顯式調用帶參 super(...),否則編譯錯誤。
class Animal {
{ System.out.println("Animal 實例塊"); }
Animal() { System.out.println("Animal 無參構造"); }
Animal(String name) { System.out.println("Animal 帶參構造: " + name); }
}
class Dog extends Animal {
{ System.out.println("Dog 實例塊"); }
Dog() { super("旺財"); System.out.println("Dog 無參構造"); }
}
// 輸出順序:Animal實例塊 → Animal帶參構造 → Dog實例塊 → Dog無參構造
| 修飾目標 | 語義 | 典型場景 |
|---|---|---|
| 類 | 不可被繼承 | String、Integer、工具類 |
| 方法 | 不可被重寫 | 模板方法模式骨架、安全敏感操作 |
| 屬性(字段) | 引用不可變(對象內部狀態仍可變) | 常量 static final、依賴注入字段 |
| 局部變量/參數 | 只能賦值一次,變為常量 | 匿名內部類捕獲變量、方法參數保護 |
final 字段必須在聲明時、實例塊或構造器中初始化(二擇一),且僅初始化一次。
super.fieldsuper.method()super(args) 必須置於子類構造器首行class Dog extends Animal {
String name = "Dog";
void printName() {
System.out.println(this.name); // Dog
System.out.println(super.name); // Animal
}
Dog(String name) {
super(name); // 必須首行
this.name = name;
}
}
默認返回 類名@哈希碼(如 Dog@15db9742)。建議所有實體類重寫,輸出業務關鍵字段,便於日誌診斷。IDE 提供 Source → Generate toString() 自動生成。
==)equals() 時必須重寫 hashCode(),保證「equal objects have equal hash codes」Generate hashCode() and equals() 基於選定字段生成標準實現// 標準 equals 模板
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dog dog = (Dog) o;
return age == dog.age && Objects.equals(name, dog.name);
}
@Override public int hashCode() {
return Objects.hash(name, age);
}
Dog.class、dog.getClass()、Class.forName("Dog") 獲取的 Class 實例,代表類元數據,JVM 每類僅一個new Dog() 創建的實例,堆內存中可有多個