super必须作为子类构造函数第一语句调用父类构造器,确保初始化顺序正确、参数匹配且上下文完整,否则编译失败。

要在子类构造函数中正确初始化父类属性并确保执行上下文完整,关键在于让父类的构造逻辑先于子类执行,且参数传递准确、位置合规。super 不是可选操作,而是 Java 对象初始化链条的强制环节。
super() 必须作为构造函数的第一条语句
Java 要求子类构造器中任何对 super 的调用(含无参或带参形式)必须出现在首行。否则编译失败,报错如:call to super must be first statement in constructor。
- ✅ 正确写法:super(name, age); —— 紧跟在构造器左大括号后,无任何前置代码
- ❌ 错误写法:System.out.println("init"); super(name); —— 输出语句导致 super 不在第一行
- ❌ 错误写法:this(); super(); —— super 和 this 不能共存,且 this() 目标构造里也必须含 super()
匹配父类构造器签名,避免隐式调用失效
若父类只提供带参构造器(如 public Person(String id, int level)),而子类构造器未显式写 super(id, level),编译器不会自动插入 super(),而是直接报错:constructor Person in class Person cannot be applied to given types。
- 父类有 protected Animal(String type, int age) → 子类可写 super("cat", 4)
- 父类只有 private Vehicle(String sn) → 子类无法调用,编译拒绝
- 参数类型必须严格一致:不能用 super(100) 去匹配 String 形参,Java 不做隐式转换
通过 super 访问父类成员,解决字段遮蔽与方法重写问题
当子类定义了与父类同名的字段或方法时,super 是唯一能明确指向父类原始实现的方式。
- 字段访问:super.name = "admin"; —— 即使子类也有 String name;,也能安全赋值父类字段
- 方法调用:super.toString(); —— 绕过子类重写的 toString,执行父类原始逻辑,适合模板方法或钩子场景
- ⚠️ 注意:super 不能在 static 方法中使用,会触发编译错误:non-static variable super cannot be referenced from a static context
初始化顺序决定对象状态完整性
Java 初始化流程是自顶向下的:从 Object 类开始,逐层执行父类构造器,最后才运行子类构造器剩余代码。这意味着:
- 父类字段在子类字段之前完成赋值
- 父类初始化块和构造器中的逻辑,早于子类中 this.xxx = ... 执行
- 若父类构造器依赖某字段已就绪(如 final 字段、不可变对象),子类必须通过 super 传入有效值,而非靠后续赋值“补救”











