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

抽象类的构造方法不是被“主动调用”的,而是由子类在创建对象时自动触发执行的——它必须参与构造器链,且必须是子类构造器的第一步。
子类构造器必须显式或隐式调用父类构造方法
Java 规定:每个子类构造器第一行必须调用父类构造器(通过 super() 或 this())。这个规则对抽象类完全适用,哪怕它不能被 new 出来。
- 如果抽象父类提供了无参构造器,子类可不写 super(),编译器会自动插入 super();
- 如果抽象父类只提供带参构造器(比如 protected Animal(String name)),子类就必须在第一行显式写出 super(name);,否则编译失败
- super() 必须是子类构造器的第一条语句,不能和 this() 同时出现
抽象类构造方法的作用不是初始化自己,而是初始化子类实例中的父类部分
抽象类虽不能实例化,但它的字段(如 protected String name;、private final Config config;)仍属于子类对象的内存布局。构造方法正是用来给这些字段赋值、做校验、设默认状态的。
- 可在构造器中对 final 字段赋值,确保关键状态不可变、一次性初始化
- 可校验参数合法性(如非空、范围),避免子类绕过基础约束
- 可准备共享资源引用(如日志器、线程池),供所有子类安全复用
访问修饰符推荐用 protected,不能用 private
抽象类构造器需要被子类访问,所以修饰符必须允许继承链调用。
立即学习“Java免费学习笔记(深入)”;
- protected 是最常用选择:子类可调用,包外无关类无法直接使用
- public 允许任意类调用,但违背封装意图,一般不推荐
- private 会导致子类无法访问,编译报错:“Cannot access xxx”
构造器里不能调用抽象方法
这是关键限制:抽象类构造器执行时,子类对象尚未完成初始化,此时调用子类重写的抽象方法,可能导致字段为 null 或逻辑异常。
- 例如在构造器中写 this.process();(而 process() 是 abstract),JVM 会调用子类版本,但子类自己的构造体还没运行
- 校验、初始化、赋值等操作应放在构造器内完成;行为扩展应推迟到模板方法或普通方法中


















