在Java中,抽象类(Abstract Class)和接口(Interface)是面向对象编程中实现抽象和多态的核心机制。它们都用于定义规范和约束子类的行为,但在使用场景和功能上有显著区别。以下从语法、特性、设计思想到应用场景的详细对比:
语法声明:使用 abstract
关键字定义。
javapublic abstract class Animal {
// 抽象方法(无实现)
public abstract void makeSound();
// 具体方法(有实现)
public void sleep() {
System.out.println("Animal is sleeping");
}
}
核心特性:
private
/protected
等)。super()
调用。sleep()
方法)。Dog
是 Animal
的一种。javaabstract class DataProcessor {
// 模板方法(固定流程)
public final void process() {
loadData();
transform();
save();
}
// 抽象步骤
protected abstract void transform();
// 默认实现
protected void loadData() { /* 加载数据 */ }
protected void save() { /* 保存结果 */ }
}
AbstractList
提供了List的部分实现(如 indexOf
方法)。interface
关键字定义。
javapublic interface Flyable {
// 抽象方法(默认 public abstract)
void fly();
// 默认方法(Java 8+)
default void glide() {
System.out.println("Gliding...");
}
// 静态方法(Java 8+)
static void printInfo() {
System.out.println("This is a Flyable interface");
}
}
public static final
。Flyable
表示对象具有飞行能力。Serializable
表示对象可序列化。javapublic class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying");
}
}
特性 | 抽象类 | 接口 |
---|---|---|
实例化 | ❌ 不能 | ❌ 不能 |
方法类型 | 抽象方法 + 具体方法 | 抽象方法 + 默认方法 + 静态方法 |
成员变量 | 普通变量(可非final) | 只能是 public static final |
构造器 | ✅ 有 | ❌ 无 |
继承机制 | 单继承(extends) | 多实现(implements) |
设计目标 | 代码复用 + 部分规范 | 定义行为契约 + 多态 |
适用关系 | "IS-A"(子类是父类的一种) | "CAN-DO"(类具有某种能力) |
sleep()
方法或 name
字段)Flyable
和 Swimmable
)AbstractList
(提供List的骨架实现),HttpServlet
(定义HTTP请求处理模板)。List
(定义集合操作规范),Runnable
(多线程任务契约)。抽象类和接口在Java中各有侧重:
本文作者:宁小健
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!