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

Java 繼承關係詳解:IS-A 與 HAS-A 的區別與應用

     編輯:程式設計綜合問答

核心概念

關係英文基礎範例程式碼表現
是一種IS-A類別繼承 或 介面實作野馬 是一種 馬class Mustang extends Horse
有一個HAS-A組合/關聯 (持有參考)馬 有 響繩class Horse { Reins reins; }

IS-A (繼承) 深度解析

  • 代表**類別之間的泛化/特化**關係。
  • 子類別擁有父類別的所有非私有屬性與方法,可直接複用。
  • 符合「里氏替換原則」:父類別出現的地方,子類別物件必須能替換使用。
  • 範例:PC 與 Workstation 皆繼承 Computer,共享 CPU、記憶體等共同屬性。

HAS-A (組合) 深度解析

  • 代表**物件之間的整體/部分**或**使用**關係。
  • 類別 A 中持有類別 B 的實例參考,透過委派呼叫 B 的功能。
  • 優於繼承:降低耦合,靈活變更組件,符合「組合優於繼承」設計原則。
  • 範例:Car 有 Engine、Wheel;同樣是 Car,引擎可換裝電動或油電混合。

常見誤區與判斷技巧

  1. 口語測試:將關係代入句子「A **是一種** B」或「A **有一個** B」,語順通順者即為該關係。
  2. 避免濫用繼承:若子類別僅需部分父類別功能,或需頻繁變更行為,改用組合+介面。
  3. 多重繼承替代:Java 不支援多重繼承,可透過實作多個介面 + 組合達到同等效果。

程式碼範例

// IS-A
abstract class Animal { abstract void makeSound(); }
class Dog extends Animal { void makeSound() { System.out.println("汪汪"); } }
class Cat extends Animal { void makeSound() { System.out.println("喵喵"); } }

// HAS-A
class Engine { void start() { System.out.println("引擎啟動"); } }
class Car {
    private Engine engine; // 組合
    public Car(Engine e) { this.engine = e; }
    public void start() { engine.start(); }
}

// 使用
Animal a = new Dog(); // IS-A: Dog 是 Animal
Car myCar = new Car(new Engine()); // HAS-A: Car 有 Engine

掌握 IS-A 與 HAS-A 的區別,能設計出高內聚、低耦合、易維護的物件導向架構。

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