在 Java 程式設計中,“is-a”和“has-a”是用來描述類別之間關係的兩種基本概念,它們分別對應於繼承和組合。
“is-a”關係
“is-a”關係是通過繼承來實現的,表示一種類別屬於另一種類別的特例,或者一種類別是另一種類別的子類。這種關係表達了類別間的一種層次結構,它允許子類繼承父類的屬性和方法。
java
Copy code
class Animal {
void eat() {
System.out.println("This animal eats food.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 繼承自 Animal
myDog.bark();
}
}
在這個例子中,Dog 是 Animal 的一種,所以我們說 Dog 和 Animal 之間是一個 “is-a” 關係。
“has-a”關係
“has-a”關係通常是通過組合或聚合來實現的,表示一種類別包含另一種類別的實例作為它的一部分。這種關係用於表示類別之間的關聯,它允許一個類別具有另一個類別的屬性和行為,而不是通過繼承獲得。
java
Copy code
class Engine {
void start() {
System.out.println("Engine starts.");
}
}
class Car {
// Car 有一個 Engine
private Engine engine;
Car(Engine engine) {
this.engine = engine;
}
void startEngine() {
engine.start(); // 委託給 Engine
}
}
public class Main {
public static void main(String[] args) {
Engine engine = new Engine();
Car myCar = new Car(engine);
myCar.startEngine();
}
}
在這個例子中,Car 有一個 Engine,所以我們說 Car 和 Engine 之間是一個 “has-a” 關係。
總結來說,“is-a”關係用於表示繼承關係,是一種類型的關係;而“has-a”關係用於表示組合或聚合關係,是一種擁有關係。這兩種關係是物件導向設計中非常重要的概念,它們有助於構造系統的結構和設計類之間的交互。