抽象类与接口
抽象类(Abstract Class)
一、是什么?
抽象类是用 abstract
关键字修饰的类,不能直接实例化。它可以包含抽象方法(无实现)和具体方法(有实现),也可以定义成员变量和构造方法。
java
public abstract class Animal {
private String name; // 成员变量
public Animal(String name) { this.name = name; } // 构造方法
public abstract void makeSound(); // 抽象方法
public void sleep() { // 具体方法
System.out.println(name + " is sleeping.");
}
}
二、解决什么问题
- 代码复用:通过具体方法提供通用逻辑,子类可直接继承。
- 规范与扩展:强制子类实现抽象方法,确保多态性。
- 封装共性:将多个子类的共同属性和行为集中管理(如动物都有
name
属性和sleep()
行为)。
三、核心方法
- 抽象方法:
public abstract void method();
(无方法体)。 - 具体方法:普通方法(含实现)。
- 构造方法:用于初始化成员变量(子类通过
super()
调用)。
四、应用场景
- 多个相关类共享相同属性和行为(如
Dog
和Cat
继承Animal
)。 - 需要部分方法实现,部分方法由子类自定义(如模板方法模式)。
- 需要定义非静态、非final的成员变量(如动物名称
name
)。
接口(Interface)
一、是什么?
接口是用 interface
关键字定义的行为规范。JDK 8 前只能包含抽象方法,之后支持默认方法(default
)和静态方法(static
)。
java
public interface Swimmable {
void swim(); // 抽象方法(默认 public abstract)
default void floatOnWater() { // JDK8 默认方法
System.out.println("Floating...");
}
static boolean isWaterSafe() { // JDK8 静态方法
return checkWaterQuality();
}
}
二、解决什么问题
- 行为解耦:定义标准行为,实现类必须遵守(如
Swimmable
要求实现swim()
)。 - 多继承替代:Java 不支持多继承,但类可实现多个接口。
- 扩展性:JDK8 的默认方法允许接口新增功能而不破坏现有实现。
三、核心方法(JDK8+)
- 抽象方法:
void method();
(隐式public abstract
)。 - 默认方法:
default void method() {...}
(提供默认实现)。 - 静态方法:
static void helper() {...}
(通过接口名调用)。 - 私有方法:JDK9 支持
private void internalLogic() {...}
(接口内部复用代码)。
四、应用场景
- 定义跨继承体系的行为(如
Swimmable
可被Fish
和Human
实现)。 - 需要多继承的场景(如一个类同时实现
Runnable
和Serializable
)。 - 为现有接口添加新功能(通过默认方法避免修改所有实现类)。
抽象类 vs 接口的区别
特性 | 抽象类 | 接口 |
---|---|---|
实例化 | ❌ 不能直接实例化 | ❌ 不能实例化 |
方法类型 | 抽象方法 + 具体方法 | JDK8前:只有抽象方法 JDK8+:抽象+默认+静态+私有方法 |
成员变量 | 可以是任意类型(非final) | 默认 public static final (常量) |
构造方法 | ✅ 有 | ❌ 无 |
继承机制 | 单继承(一个子类只能继承一个) | 多实现(一个类可实现多个接口) |
设计目的 | 代码复用 + 扩展规范 | 行为契约 + 解耦 |
典型应用 | “is-a”关系(如 Dog is an Animal ) | “can-do”能力(如 CanSwim ) |
重要注意事项
- 抽象类:
- 子类必须实现所有抽象方法(除非子类也是抽象类)。
- 成员变量不强制是
final
。
- 接口:
- 方法默认
public
,成员变量默认public static final
。 - JDK8 的默认方法可被实现类重写,静态方法通过接口名调用(如
Swimmable.isWaterSafe()
)。 - 避免默认方法冲突:若实现多个含同名默认方法的接口,需在类中重写该方法。
- 方法默认
总结
场景 | 推荐选择 |
---|---|
需要共享代码(属性/方法) | ✅ 抽象类 |
定义行为规范(多实现) | ✅ 接口 |
需要多继承 | ✅ 接口(多实现) |
需要构造方法初始化状态 | ✅ 抽象类 |
扩展JDK库功能(如集合类) | ✅ 接口(默认方法) |
实际应用:
- 抽象类:GUI 的
BaseDialog
(含通用渲染逻辑)。 - 接口:
Comparable
(排序)、Runnable
(多线程)、Stream
(函数式编程)。
JDK8+ 关键革新:接口通过默认方法实现“向后兼容”,使集合框架等核心库能平滑演进(如
List
新增stream()
方法)。