Java调用父类构造器需要注意哪些细节?不同情况下构造器调用有何区别?
- 后端开发
- 2025-10-18
- 5
在Java中,子类在创建时会自动调用父类的构造器,除非你显式地调用它,如果父类没有无参构造器,你需要显式地调用一个带有参数的构造器,下面是几种在Java中调用父类构造器的方法。
通过构造函数代码块
你可以使用构造函数代码块(Constructor Chaining)来调用父类的构造器,这是最简单的方法,不需要任何特殊的语法。

通过super关键字
在子类的构造器中,你可以使用super()关键字来显式调用父类的无参构造器,如果你没有调用任何构造器,编译器会自动为你加上super()。
public class Parent { public Parent() { System.out.println("Parent constructor called"); } } public class Child extends Parent { public Child() { super(); // This is the same as super() without arguments System.out.println("Child constructor called"); } }
通过super关键字调用带参数的构造器
如果父类有带参数的构造器,你可以通过传递适当的参数来调用它。
public class Parent { private String message; public Parent(String message) { this.message = message; System.out.println("Parent constructor called with message: " + message); } } public class Child extends Parent { public Child(String message) { super(message); // Calling the parameterized constructor of Parent System.out.println("Child constructor called with message: " + message); } }
使用this关键字
在某些情况下,你可能需要在子类的构造器中调用另一个构造器,这可以通过使用this()关键字来实现,这通常只在子类内部有多个构造器时使用。

public class Parent { private String message; public Parent(String message) { this.message = message; System.out.println("Parent constructor called with message: " " + message); } public Parent() { this("Default message"); // Calling another constructor of the same class } }
通过反射调用构造器
如果你想要在运行时动态地调用构造器,你可以使用Java反射API。

public class Parent { public Parent() { System.out.println("Parent constructor called"); } } public class Main { public static void main(String[] args) { try { Class<?> parentClass = Class.forName("Parent"); Constructor<?> constructor = parentClass.getConstructor(); Parent parent = (Parent) constructor.newInstance(); } catch (Exception e) { e.printStackTrace(); } } }
| 方法 | 语法 | 描述 |
|---|---|---|
| 构造函数代码块 | 无需显式调用 | 如果没有显式调用构造器,子类的构造器会自动调用父类的无参构造器 |
| super关键字 | super() | 显式调用父类的无参构造器 |
| super关键字 | super(args) | 显式调用父类的带参数构造器 |
| this关键字 | this(args) | 在同一个类中调用另一个构造器 |
| 反射 | Constructor<?> constructor = parentClass.getConstructor(); Parent parent = (Parent) constructor.newInstance(); | 使用反射API动态调用构造器 |
FAQs
Q1:为什么子类需要调用父类的构造器?
A1:子类需要调用父类的构造器来初始化父类中定义的成员变量,如果不调用父类的构造器,那么父类中的成员变量将不会被初始化,这可能会导致运行时错误。
Q2:如果父类没有构造器,子类如何调用父类的构造器?
A2:如果父类没有构造器,子类将无法通过常规方式调用父类的构造器,在这种情况下,你需要在子类的构造器中调用父类的无参构造器,如果没有无参构造器,那么子类也无法创建实例。