3.5 接口与抽象类
1. 接口(Interface)
1.1 接口的定义与特性
- 定义:接口是Java中一种完全抽象的类,用于定义一组方法的规范(抽象方法集合)。
- 特性:
- 使用
interface关键字声明。 - 默认所有方法为
public abstract(可省略修饰符)。 - 接口中可包含常量(默认
public static final)。 - Java 8后支持默认方法(
default)和静态方法(static)。
- 使用
1.2 接口的实现
- 通过
implements关键字实现接口。 - 实现类必须重写接口中所有抽象方法(除非是抽象类)。
- 一个类可实现多个接口(多继承的替代方案)。
interface Flyable {
void fly();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying");
}
}
2. 抽象类(Abstract Class)
2.1 抽象类的定义与特性
- 定义:抽象类是用
abstract修饰的类,可以包含抽象方法和具体实现。 - 特性:
- 不能直接实例化。
- 可以包含构造方法(用于子类初始化)。
- 可以定义成员变量和具体方法。
- 子类必须重写所有抽象方法(除非子类也是抽象类)。
abstract class Animal {
abstract void makeSound();
void sleep() {
System.out.println("Animal is sleeping");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark!");
}
}
3. 接口与抽象类的对比
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 关键字 | interface | abstract class |
| 方法实现 | 默认无实现(Java 8支持默认方法) | 可包含具体方法和抽象方法 |
| 多继承 | 支持(一个类可实现多个接口) | 不支持(单继承) |
| 成员变量 | 只能是常量 | 可以是普通变量 |
| 设计目的 | 定义行为规范 | 提供代码复用和部分实现 |
4. 应用场景
4.1 何时使用接口?
- 需要定义一组不相关的类的共同行为。
- 需要实现多继承功能。
- 例如:
Comparable(排序)、Runnable(多线程)。
4.2 何时使用抽象类?
- 需要为子类提供通用代码实现。
- 需要定义模板方法模式。
- 例如:
InputStream(定义部分IO操作)。
5. Java 8及以后的增强
- 默认方法:允许接口提供默认实现,避免破坏现有代码。
interface Vehicle { default void start() { System.out.println("Vehicle started"); } } - 静态方法:接口中可直接定义静态工具方法。
6. 最佳实践
- 优先使用接口:保持灵活性,避免继承的局限性。
- 抽象类用于代码复用:当多个子类有共享逻辑时。
- 避免过度设计:仅在必要时使用抽象类或接口。
思考题:
- 为什么Java不支持多继承但允许实现多个接口?
- 如何设计一个既需要模板方法又需要多继承的场景?
