抽象类可定义构造方法但不能直接实例化,其构造方法在子类创建对象时通过super()隐式或显式调用,用于初始化字段或执行公共逻辑,访问修饰符通常为protected,不可为private,且不可调用抽象方法。

抽象类可以定义构造方法,但不能直接实例化,它的构造方法只在子类创建对象时被隐式调用(通过 super()),用于初始化抽象类中定义的字段或执行公共初始化逻辑。
抽象类的构造方法写法
和普通类一样,抽象类的构造方法可以有任意访问修饰符(public、protected、包级私有),但通常推荐 protected —— 既允许子类调用,又防止被无关类误用。
- 可以重载多个构造方法,支持不同参数组合
- 可包含初始化代码,比如给
final字段赋值、校验参数、设置默认状态 - 子类构造器中必须显式或隐式调用父类(抽象类)的一个构造方法
子类如何调用抽象父类的构造方法
子类构造器第一行默认会插入 super() 调用父类无参构造;如果抽象类没有无参构造,就必须显式写 super(...) 并匹配某个构造签名。
- 若抽象类只定义了带参构造,子类必须显式调用,否则编译报错
- 子类可通过
this(...)或super(...)控制调用链,但super(...)必须是第一句 - 抽象类的构造方法在子类对象创建时执行,早于子类自己的构造体
实际例子说明
比如一个表示“形状”的抽象基类:
abstract class Shape {
protected final String name;
protected final double scale;
<pre class="brush:java;toolbar:false;">protected Shape(String name) {
this(name, 1.0);
}
protected Shape(String name, double scale) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("name cannot be null or empty");
}
this.name = name;
this.scale = Math.max(0.1, scale); // 确保最小缩放
}
public abstract double area();}
子类实现时需调用它:
class Circle extends Shape {
private final double radius;
<pre class="brush:java;toolbar:false;">public Circle(double radius) {
super("Circle"); // 调用 Shape(String)
this.radius = radius;
}
public Circle(String name, double radius, double scale) {
super(name, scale); // 调用 Shape(String, double)
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius * scale;
}}
注意事项
- 抽象类不能有
private构造方法(除非内部静态工厂方法使用,但子类无法继承调用) - 构造方法里不能调用抽象方法(因为子类对象尚未完全构建,可能导致未定义行为)
- 不要在抽象类构造中依赖子类已重写的非
final方法或字段 - 若希望强制子类传参初始化,就只提供带参构造,不写无参构造
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











