抽象类构造方法写法与普通类完全相同:名称同类名、无返回类型(含void)、推荐protected修饰;子类必须通过super()显式调用,用于初始化继承字段和共享逻辑。

可以定义,也必须被子类调用——抽象类虽然不能用 new 实例化,但它的构造方法是为子类服务的,用于初始化继承自父类的字段和公共逻辑。
抽象类中怎么定义构造方法
写法和普通类完全一样:
- 方法名必须与类名相同,不写返回类型(连
void都不能写) - 推荐用 protected 修饰:既允许子类访问,又防止外部误调用
- 不能用 private:子类无法访问,编译直接失败
- 不建议用 public:抽象类本就不能被 new,public 没实际意义
- 可重载多个构造方法,适配不同参数组合(如只传 name,或同时传 name 和 timeout)
- 可以在里面给
final字段赋值、做参数校验(如非空、正数)、初始化共享资源(如 Logger) - 避免在构造方法中调用抽象方法——此时子类字段可能还没初始化,容易触发
NullPointerException
子类中怎么调用抽象父类的构造方法
Java 编译器强制要求:每个子类构造器的第一条语句,必须是 super() 或 super(参数)。
- 如果抽象父类有无参构造,子类可省略
super(),编译器会自动插入 - 如果抽象父类只有带参构造(比如
protected Animal(String name)),子类就必须在第一行显式写super(name),否则编译报错 -
super()必须是子类构造器的第一条语句,不能和this()共存 - 调用的是父类自己的
方法,由 JVM 用invokespecial指令执行,不走动态绑定
构造方法在抽象类中的真实作用
不是为了创建父类对象,而是统一控制子类对象中“属于父类那部分”的初始化过程:
- 初始化
protected或包级私有字段(如name、timeout) - 封装参数校验逻辑(如字符串非空、数值范围检查),避免子类各自重复判断
- 给
final字段赋值(这是唯一合法时机) - 准备共享资源引用(如日志器、配置对象、连接池等)
- 整个初始化流程中,JVM 分配内存后,按顺序执行:父类实例块 → 父类构造体 → 子类实例块 → 子类构造体;操作的始终是同一个子类实例对象
不复杂但容易忽略:抽象类的构造方法,是子类安全、一致初始化的底层支撑,不是摆设。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











