文章目錄
- 1、主要區別
- 2、使用場景
- 2.1 使用接口的情況:
- 2.1 使用抽象類的情況:
- 3、Java 8及以后的接口增強
- 4、設計建議
1、主要區別
特性 | 接口(Interface) | 抽象類(Abstract Class) |
---|---|---|
定義方式 | 使用interface 關鍵字 | 使用abstract class 關鍵字 |
方法實現 | Java 8前不能有實現(默認方法除外) | 可以有具體方法和抽象方法 |
變量 | 默認public static final (常量) | 可以是普通變量 |
構造方法 | 不能有 | 可以有 |
多繼承 | 一個類可實現多個接口 | 一個類只能繼承一個抽象類 |
訪問修飾符 | 方法默認public | 方法可以有各種訪問修飾符 |
設計目的 | 定義行為規范 | 提供部分實現,作為基類 |
2、使用場景
2.1 使用接口的情況:
- 需要定義一組行為規范,讓不同類實現
- 需要多重繼承行為時
- 需要定義回調機制時
- 希望實現松耦合設計時
// 接口示例
public interface Drawable {void draw(); // 抽象方法default void resize() { // Java 8默認方法System.out.println("Resizing...");}
}class Circle implements Drawable {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}
2.1 使用抽象類的情況:
- 多個相關類共享代碼時
- 需要有非final變量時
- 需要控制子類的訪問權限時
- 需要定義模板方法模式時
// 抽象類示例
public abstract class Animal {private String name;public Animal(String name) {this.name = name;}public abstract void makeSound();public void eat() {System.out.println(name + " is eating");}
}class Dog extends Animal {public Dog(String name) {super(name);}@Overridepublic void makeSound() {System.out.println("Woof!");}
}
3、Java 8及以后的接口增強
從Java 8開始,接口可以包含:
- 默認方法(default methods) - 提供默認實現
- 靜態方法(static methods) - 接口級別的工具方法
public interface Vehicle {// 抽象方法void start();// 默認方法default void stop() {System.out.println("Vehicle stopped");}// 靜態方法static void honk() {System.out.println("Honk honk!");}
}
4、設計建議
- 優先考慮接口 - 因為Java不支持多重繼承,接口更靈活。
- 當需要共享代碼時使用抽象類。
- 接口適合定義**“能做什么”**(行為)
- 抽象類適合定義**“是什么”**(本質)
- 考慮使用**“接口+抽象類”**的組合模式,接口定義行為,抽象類提供部分實現。