接口(Interface)和抽象类(Abstract Class)是面向对象编程中用于抽象和多态的两个重要概念,虽然它们都用于定义“规范”,但设计目的和使用方式有明显区别。下面从多个维度进行对比说明(以 Java 为例,其他语言类似)。
| 对比维度 | 接口(Interface) | 抽象类(Abstract Class) |
|---|---|---|
| 是否可实例化 | ❌ 不能 | ❌ 不能 |
| 是否可包含实现 | ✅(Java 8+ 默认方法) | ✅ 可包含具体方法 |
| 成员变量 | 默认 public static final |
普通成员变量 |
| 构造方法 | ❌ 没有 | ✅ 有 |
| 继承/实现关系 | 类可实现多个接口 | 类只能继承一个抽象类 |
| 设计目的 | 定义“能做什么”(能力) | 定义“是什么”(共性) |
| 耦合度 | 低 | 相对较高 |
interface Flyable {
void fly();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying");
}
}
✅ 定义行为规范
✅ 对外提供统一 API
✅ 解耦模块之间的依赖
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound();
public void sleep() {
System.out.println(name + " is sleeping");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " barks");
}
}
✅ 抽取公共父类
✅ 共享代码和状态
✅ 表示一组相关对象的共性
飞机能飞(Flyable)
鸟能飞(Flyable)
狗是动物(Animal)
猫是动物(Animal)
interface Service {
void execute();
}
abstract class AbstractService implements Service {
protected void log() {
System.out.println("Logging...");
}
}
class MyService extends AbstractService {
@Override
public void execute() {
log();
System.out.println("Executing...");
}
}
接口定义“能做什么”,抽象类定义“是什么”。
接口用于解耦和规范,抽象类用于复用和继承。
如果你愿意,我也可以从 C# / Python / 前端 TS 接口 的角度再对比一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。