在 Java 語言中,類別(class)和介面(interface)是兩種不同的結構,它們有各自的用途和特性。以下是類別和介面的主要區別,以及一些例子來說明這些區別。
主要區別
定義與實現:
類別(class):可以定義並實現方法,並且可以包含屬性(變數)。
介面(interface):只能定義方法簽名(即方法的名稱、參數和返回值),不能實現方法(Java 8 之前)。Java 8 引入了預設方法(default methods)和靜態方法(static methods),允許在介面中包含一些實現。
繼承:
類別(class):支持單繼承,即一個類只能繼承自一個父類,但可以實現多個介面。
介面(interface):支持多重繼承,一個介面可以繼承多個其他介面。
抽象程度:
類別(class):可以是具體的(concrete class,有實現的方法)或抽象的(abstract class,有部分或全部抽象的方法)。
介面(interface):本質上是完全抽象的,定義了一組必須由實現類別提供的方法。
訪問修飾符:
類別(class):可以有不同的訪問修飾符(public、protected、private、package-private)。
介面(interface):介面內的方法和屬性默認是 public 的(Java 9 之前)。從 Java 9 開始,介面中允許有私有方法(private methods)。
例子
類別範例
java
複製程式碼
// 定義一個父類 Animal
abstract class Animal {
String name;
Animal(String name) {
this.name = name;
}
// 抽象方法
abstract void makeSound();
// 具體方法
void eat() {
System.out.println(name + " is eating.");
}
}
// 繼承 Animal 的子類 Dog
class Dog extends Animal {
Dog(String name) {
super(name);
}
// 實現抽象方法
void makeSound() {
System.out.println(name + " says: Woof Woof");
}
}
介面範例
java
複製程式碼
// 定義一個介面 Pet
interface Pet {
// 介面方法(默認是 public abstract)
void play();
}
// 定義另一個介面 Trainable
interface Trainable {
void train();
}
// 實現介面 Pet 和 Trainable 的類別 Dog
class Dog implements Pet, Trainable {
String name;
Dog(String name) {
this.name = name;
}
// 實現 Pet 的方法
public void play() {
System.out.println(name + " is playing.");
}
// 實現 Trainable 的方法
public void train() {
System.out.println(name + " is being trained.");
}
}
使用範例
java
複製程式碼
public class Main {
public static void main(String[] args) {
// 使用類別
Dog myDog = new Dog("Buddy");
myDog.makeSound();
myDog.eat();
// 使用介面
Pet myPet = new Dog("Charlie");
myPet.play();
Trainable myTrainable = new Dog("Rocky");
myTrainable.train();
}
}
結論
類別 用於定義物件的屬性和行為,可以包含具體的實現。
介面 用於定義行為規範,實現多重繼承和解耦。
理解這些概念有助於編寫靈活、可維護的 Java 程式。