java子类实例化时父类构造方法必被调用:隐式super()要求父类有可访问无参构造器,否则须显式super(参数)且置于首行;初始化顺序为父类静态→子类静态→父类实例变量→父类构造→子类实例变量→子类构造。

Java 中子类实例化时,父类构造方法一定会被调用——不是“可选”,而是 JVM 强制要求的初始化环节。这个调用可以是隐式的,也可以是显式的,关键在于父类是否有无参构造器。
隐式调用 super() 的前提和行为
当你在子类构造方法中什么都没写(既没写 super(...),也没写 this(...)),编译器会自动在第一行插入 super(),也就是调用父类的无参构造方法。
- 前提是父类必须存在一个可访问的无参构造器(public、protected 或默认包权限)
- 如果父类只定义了带参构造器,而你又没手动写 super(...),编译直接失败
- 即使父类有多个构造器,只要它有一个无参的,子类不写 super() 也能通过编译
显式调用 super(参数) 的必要场景
当父类没有无参构造器时,子类必须在每个构造方法的第一行,用 super(实参) 显式调用匹配的父类带参构造器。
- 参数个数、类型、顺序必须与父类某个构造方法完全一致
- super(...) 必须是子类构造方法的第一条语句,否则编译报错
- 不能在一个构造方法里同时出现 super(...) 和 this(...)
- 例如:父类 Animal(String name),子类就得写 super("旺财")
调用时机与初始化顺序不可跳过
无论隐式还是显式,父类构造方法总是在子类构造方法体执行前完成。JVM 严格按以下顺序初始化:
- 父类静态成员 → 子类静态成员
- 父类实例变量初始化 → 父类构造方法执行
- 子类实例变量初始化 → 子类构造方法执行
这个顺序保证了父类字段已就绪,子类才能安全使用继承来的成员。但要注意:若父类构造器中调用了被子类重写的方法,此时子类字段尚未初始化,可能读到默认值(如 null、0)。
常见错误与规避方式
这些错误在编译期就能暴露,提前识别能少走弯路:
- 写 super() 但父类没有无参构造器 → 改为 super(对应参数)
- 把 super(...) 写在第二行 → 剪切到第一行
- 误写成 Parent(...) 当作方法调用 → 这是语法错误,必须用 super(...)
- 在父类构造器里调用非 final 实例方法 → 尽量改为 private 或 final,或延迟到初始化后调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











