cannot reference this before supertype constructor has been called

这个错误通常是在子类构造函数中调用了父类构造函数之前,尝试访问了父类构造函数中的变量或方法导致的。

在Java中,每个子类的构造函数都必须首先调用其直接父类的构造函数,以确保所有的父类变量和方法被正确地初始化。如果子类构造函数在调用父类构造函数之前尝试访问父类的变量或方法,则会出现这个错误。

要解决这个问题,可以通过将子类构造函数的调用父类构造函数的语句移动到构造函数的第一行来解决。这样,所有的父类变量和方法都会先被初始化,然后子类才可以使用它们。

例如,假设你有以下的类继承关系:

public class Animal {
    protected String name;
    public Animal(String name) {
        this.name = name;
public class Cat extends Animal {
    private int age;
    public Cat(String name, int age) {
        this.age = age; // ERROR: cannot reference 'this' before supertype constructor has been called
        super(name); // call to super must be first statement in constructor body

你可以通过将 super(name) 放在构造函数的第一行来解决这个问题:

public class Cat extends Animal {
    private int age;
    public Cat(String name, int age) {
        super(name); // call to super must be first statement in constructor body
        this.age = age;

这样就可以保证父类构造函数先被调用,然后子类才可以访问父类的变量和方法。

  •