繼承是面向對象復用代碼、建立類層次結構的核心機制。Java 支持單繼承(一個類只能繼承一個父類),但允許多層繼承(孫子繼承兒子繼承父親),通過 extends 關鍵字實現。本文系統講解繼承特點、關係判斷、注意事項及最佳實踐。
class A extends B,避免菱形繼承問題。C++ 支持多繼承,Java 用接口實現多實現。Student extends Person。滿足里氏替換原則:父類引用可指向子類對象。class Person { Dog dog; }、「球隊有球員」→ class Team { List players; } 。代碼中最常見,耦合度低於繼承。判斷技巧: 用「A 是 B」造句,通順則考慮繼承;否則用組合。
class Parent {
private String secret; // 私有,子類不可直接訪問
protected int age; // 保護,子類可見
public void eat() { ... } // 公共,可重寫
}
class Child extends Parent {
// 繼承了 age、eat();secret 不可見
@Override
public void eat() { // 重寫
System.out.println("Child eating...");
}
}
private 字段/方法,需通過公共/保護 getter/setter 間接訪問。super()(父類無參構造器)。若父類無無參構造器,子類必須顯式 super(參數) 調用帶參構造器。new Child() → Child() → super() → Parent() → Object()。保證父類先初始化,再初始化子類字段。class Animal {
String name = "Animal";
Animal() { System.out.println("Animal()"); }
Animal(String name) { this.name = name; System.out.println("Animal(name)"); }
}
class Dog extends Animal {
String name = "Dog"; // 隱藏父類 name
Dog() { System.out.println("Dog()"); }
Dog(String name) { super(name); System.out.println("Dog(name)"); }
void printNames() {
System.out.println("this.name=" + this.name); // Dog
System.out.println("super.name=" + super.name); // Animal
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog("Buddy");
// 輸出:
// Animal(name)
// Dog(name)
d.printNames();
}
}
final,如 String、Integer、工具類。繼承是把雙刃劍:用得好極大提升復用與擴展性,用不好導致脆弱的類層次、強耦合、難以維護。理解其語法機制、構造器鏈、字段隱藏與設計原則,方能駕輕就熟。