抽象类构造方法由子类构造器自动调用,用于初始化继承字段和校验参数;必须显式或隐式通过super()调用,且修饰符应为protected。

抽象类的构造方法不是被“主动调用”的,而是由子类构造器在初始化过程中自动触发的——只要子类创建对象,JVM 就会强制执行父类(包括抽象类)的构造逻辑。
子类构造器必须显式或隐式调用父类构造方法
Java 规定:每个子类构造器的第一条语句,必须是 super()(调用父类无参构造)或 super(参数)(调用父类带参构造)。这个规则对抽象类完全适用。
- 如果抽象父类提供了无参构造,子类可不写
super(),编译器会自动插入 - 如果抽象父类只提供带参构造(比如
protected Animal(String name)),子类就必须在第一行写super(name),否则编译失败 -
super(...)必须是子类构造器的第一条语句,不能和this(...)共存
抽象类构造方法实际作用是初始化父类状态
它不会创建独立的父类实例,而是为正在构建的子类对象初始化继承来的字段和公共逻辑:
- 给
protected final String id赋值,确保所有子类都拥有合法、不可变的身份标识 - 校验传入参数(如非空、正数、格式合规),把错误拦在对象创建初期
- 初始化共享资源引用(如日志器、配置对象),避免子类重复声明
- 不能在其中调用抽象方法——此时子类字段可能还未赋值,容易引发
NullPointerException或逻辑异常
访问修饰符推荐用 protected
抽象类构造方法不宜设为 public(无意义,无法直接 new),也不能是 private(子类无法访问)。
-
protected是最合理的选择:允许子类调用,又防止包外无关类误用 - 可以重载多个构造方法,适配不同初始化场景(如仅传 name,或同时传 name + timeout)
底层机制:对象已存在,构造器只负责初始化
执行 new Dog() 时,JVM 先分配内存并设默认值(null、0 等),再按顺序执行:
- 父类实例初始化块(
{...})→ 可能调用子类实现的抽象方法(危险但合法) - 父类构造方法体 → 执行你写的校验、赋值等逻辑
- 子类实例初始化块
- 子类构造方法体
整个过程操作的是同一个对象——它是 Dog 类型的实例,只是在初始化阶段借用了抽象父类的构造逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











