Java中构造器不被继承,子类实例化时父类构造器必执行,这是编译器强制插入的初始化链;隐式super()在无this()或super(...)时自动添加,调用父类无参构造器,且必须为第一语句。

Java 中构造器不被继承,但子类实例化时,父类构造器一定会被执行——这不是“继承”,而是编译器强制插入的初始化链。理解的关键在于:不是子类“拥有”父类构造器,而是子类构造过程“必须先完成父类部分的初始化”。
隐式 super() 是编译器自动补上的第一行
只要子类构造器第一行既没写 this()(调本类其他构造器),也没写 super(...)(调父类构造器),编译器就会在字节码层面悄悄加上 super(),即调用父类无参构造器。
- 这行调用必须是构造器的第一条语句,否则编译报错
- 如果父类根本没有无参构造器(比如只定义了
public Parent(String name)),而子类又没显式写super("xxx"),代码直接编译失败 - 哪怕父类是抽象类,只要它有可访问的无参构造器,这条隐式规则依然生效
执行顺序永远是从顶向下、逐层触发
对象创建时的初始化链是严格单向的:Object → 父类 → 子类。每一步都依赖上一步已完成。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- new Dog() 触发 Dog() 构造器 → 编译器插入 super() → 调用 Animal() → Animal() 内部又隐式 super() → 调用 Object()
- 输出顺序一定是:Object 构造器 → Animal 构造器 → Dog 构造器
- 这个链条不可跳过、不可并行,也不受子类构造器内部代码位置影响
隐式调用 ≠ 可省略责任
看起来没写 super() 就能运行,容易误以为“父类初始化是自动的、跟自己无关”。其实恰恰相反:
立即学习“Java免费学习笔记(深入)”;
- 你写的每个子类构造器,本质上都在承诺:“我负责确保父类能正确初始化”
- 当父类构造器需要参数(比如数据库连接、配置名)时,你必须显式用
super(config)把必要信息传过去 - 若父类无参构造器被删掉或设为 private,所有未显式调用 super(...) 的子类都会立即暴露问题
和 this() 共存时,super() 不再隐式出现
如果子类构造器第一行是 this(...),说明它把初始化任务委托给本类另一个构造器;那个被调用的构造器仍需满足“第一行是 this() 或 super()”的规则。
- 也就是说,this() 只是转移控制权,最终总得有一条路径落到 super() 上
- this() 和 super() 绝对不能出现在同一个构造器里——语法禁止,因为初始化只能走一条链
- 这种委托机制让代码复用更干净,但不改变“父类必须先初始化”的本质

















