接口(interface)和抽象類(abstract class)都是 Java 中常用的“抽象”工具,用來定義類的規范和結構,但它們有一些本質的區別。下面我用一個簡單明了的表格 + 說明來幫你理解:
對比點 | 抽象類(Abstract Class) | 接口(Interface) |
---|---|---|
關鍵詞 | abstract class | interface |
是否可包含實現 | ? 可以有方法實現、構造函數、成員變量 | ?(Java 8 之后可以用 default 和 static 方法) |
多繼承支持 | ? 只能繼承一個抽象類 | ? 可以實現多個接口 |
使用場景 | 表示“是一個什么”關系(is-a) | 表示“能做什么”能力(can-do) |
構造函數 | ? 有構造函數 | ? 沒有構造函數 |
狀態(字段) | ? 可以有成員變量 | 🚫 接口中的變量默認是 public static final 常量 |
簡單舉例:
抽象類例子
abstract class Animal {String name;abstract void makeSound();void sleep() {System.out.println("Sleeping...");}
}
接口例子
interface Flyable {void fly();
}
如果你寫一個 Bird
類,可以這樣組合:
class Bird extends Animal implements Flyable {void makeSound() {System.out.println("Chirp");}public void fly() {System.out.println("Flying high!");}
}
總結口訣:
- 抽象類像模板,可以提供一部分默認實現;
- 接口像協議,只規定規則,不管怎么實現;
- 想讓一個類**“擁有某種能力”**,用接口;
- 想讓一個類**“繼承某種通用結構”**,用抽象類。