抽象类可含构造方法和非抽象方法,构造方法在子类实例化时被调用以初始化继承成员,非抽象方法提供可复用逻辑并支持模板方法模式,区别于接口在于支持构造器、实例变量及单继承语义。

抽象类在 Java 中确实可以包含构造方法和非抽象方法,这是它区别于接口的重要特性之一。
抽象类可以有构造方法
虽然抽象类不能被直接实例化,但它仍然可以定义构造方法。这个构造方法会在其子类创建对象时被调用(通过 super() 隐式或显式调用),用于初始化从抽象类继承的成员变量或执行公共的初始化逻辑。
- 构造方法不能是 abstract 的
- 子类构造器必须调用父类(抽象类)的构造方法,否则编译报错
- 常用于设置抽象类中 protected 或 private 的初始状态
抽象类可以定义非抽象方法
抽象类不仅可以声明抽象方法(无方法体、强制子类实现),还可以提供具体实现的方法。这些非抽象方法可被子类直接继承使用,也可被重写(除非用 final 修饰)。
- 适合封装子类共有的行为逻辑,比如通用校验、日志记录、模板方法中的固定步骤
- 配合抽象方法构成“模板方法模式”,例如 AbstractList 中的 get() 是抽象的,而 indexOf() 是基于 get 实现的非抽象方法
- 提高了代码复用性,避免在每个子类中重复编写相同逻辑
与接口的关键区别(补充说明)
Java 8 之后接口也可以有默认方法(default)和静态方法,但仍有本质不同:
立即学习“Java免费学习笔记(深入)”;
- 接口不能有构造方法,无法参与对象初始化流程
- 接口中的字段默认是 public static final,而抽象类可定义任意访问级别的实例变量
- 一个类只能继承一个抽象类,但可实现多个接口——这决定了抽象类更适合表达“是什么”(is-a),接口更适合表达“能做什么”(can-do)
不复杂但容易忽略:抽象类的价值不仅在于约束子类实现,更在于承载可复用的骨架代码和初始化逻辑。


















