Java 接口(Interface)与抽象类(Abstract Class)详解
接口和抽象类是 Java 中实现抽象编程的两种核心机制,均用于定义规范并实现代码复用,但在设计目的和使用场景上有显著差异。本文将从定义、特性、演化及对比等方面,全面解析两者的核心区别与适用场景。
抽象类(Abstract Class)
抽象类是包含抽象方法的类,既可以提供部分方法的实现,也可以声明未实现的抽象方法,强制子类完成具体逻辑。其核心是 “部分抽象”—— 作为父类为子类提供基础实现,同时保留扩展空间。
核心特性
- 抽象方法:用
abstract修饰的方法,仅有声明无方法体(如abstract void func();),必须由子类重写。 - 不能实例化:抽象类无法通过
new创建对象,需由实现了所有抽象方法的子类实例化。 - 可包含具体方法:抽象类可以有非抽象方法(带方法体),子类可直接复用这些实现。
- 可包含实例变量:支持定义非静态成员变量,可通过非抽象方法操作这些变量(维护对象状态)。
- 构造器:抽象类有构造器(用于子类初始化时调用),但不能直接用于实例化自身。
语法规则
- 类用
abstract修饰(如public abstract class Animal)。 - 抽象方法不能用
private、final、static修饰(这些修饰符会阻止子类重写)。 - 若子类未实现抽象类的所有抽象方法,则子类必须也声明为抽象类。
1 | // 抽象类示例 |
设计目的
抽象类用于表达 “is-a” 关系(子类是父类的具体类型),适用于存在共性实现的场景。例如:
