接口 (Interface)
- 定义:使用
interface
关键字定义。 - 实例化:接口不能被直接实例化。
- 实现:一个类可以实现多个接口。
- 方法:Java 8 之前,接口中只能包含抽象方法(默认为
public abstract
)。Java 8 之后,接口可以包含默认方法(default
)和静态方法(static
),并且这些方法需要有方法体。 - 成员变量:接口中只能有常量,即
public static final
变量,并且需要初始化。 - 设计思想:主要用于定义行为规范,强调“做什么”。
抽象类 (Abstract Class)
- 定义:使用
abstract
关键字定义。 - 实例化:抽象类不能被直接实例化。
- 继承:一个类只能继承一个抽象类。
- 方法:抽象类可以包含抽象方法和非抽象方法。非抽象方法需要有方法体。
- 成员变量:抽象类可以有实例变量和静态变量,包括私有变量。
- 设计思想:用于表示一种类的继承关系,强调“是什么”,包含共享的代码和通用的行为。
关键区别
- 继承与实现:
- 抽象类:使用
extends
继承。 - 接口:使用implements
实现。 - 多继承: - 抽象类:一个类只能继承一个抽象类。 - 接口:一个类可以实现多个接口。
- 方法实现: - 抽象类:可以包含抽象方法和具体方法。 - 接口:Java 8 之前只能包含抽象方法,Java 8 之后可以包含默认方法和静态方法。
- 成员变量:
- 抽象类:可以有各种类型的成员变量,包括私有变量。
- 接口:只能有
public static final
常量,并且需要初始化。 - 设计思想: - 抽象类:强调“是什么”,包含共享的代码和通用的行为。 - 接口:强调“做什么”,定义行为规范。
总结
- 接口:主要用于定义行为规范,允许一个类实现多个接口,增强代码的灵活性。
- 抽象类:主要用于表示类的继承关系,提供共享的代码和通用的行为,强调“是什么”。
这两种设计模式各有优势,选择使用哪种取决于具体的业务需求和设计目标。