子类必须显式调用super()是因为父类无无参构造器时,编译器无法自动插入super(),否则报错“Implicit super constructor is undefined”;super(...)须为子类构造器首行,参数须完全匹配父类对应构造方法。

Java 中,子类必须显式或隐式调用父类的构造方法。如果父类**只有带参构造方法**(即没有无参构造器),子类构造器中就必须用 super(...) 显式调用父类对应的带参构造方法,且该调用必须是子类构造器中的**第一行语句**。
为什么必须显式调用 super?
当父类没有无参构造器时,编译器无法自动插入 super()(因为该方法不存在),所以子类构造器若不写 super(参数),就会编译报错:“Implicit super constructor XXX() is undefined”。这时你必须手动指定调用哪个父类构造器。
基本写法:在子类构造器首行写 super(对应参数)
确保传入的参数类型、个数、顺序与父类构造方法完全匹配。
- 父类有
public Person(String name, int age)→ 子类中写super(name, age) - 父类有多个重载构造器(如
Person(String id)和Person(String name, int age))→ 子类可任选其一调用,只要参数能匹配 - 不能在 super 调用前执行任何其他语句(包括变量声明、打印、this(...) 等)
常见错误示例
❌ 错误1:没写 super,且父类无无参构造器
子类构造器空着,编译失败。
❌ 错误2:super 写在第二行System.out.println("hello"); super(name); → 编译报错:“Call to super must be first statement”
❌ 错误3:参数类型不匹配
父类要 int,你传了 String;或少传/多传参数 → 编译不通过
补充:可以结合 this() 使用,但二者互斥
一个构造器里只能出现 this(...) 或 super(...) 中的一个,且都必须是第一行。比如:
立即学习“Java免费学习笔记(深入)”;
- 用
this(...)调用本类其他构造器 → 那它内部最终仍需调用super(...) - 直接写
super(...)→ 就跳过本类其他构造器,直连父类


















