即使子类已经具有定义的构造函数,父类是否总是需要默认或无参数的构造函数?

K M*_*Man 6 java parameters inheritance constructor default-constructor

我无法编译此代码。

class Horse {
    private int age;
    Horse(int age) {
        this.age = age;
    }
}

class Pony extends Horse {
    private int age;
    Pony(int age) { //here compiler complains about no default constructor in parent class
        this.age = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道当父类只有带有参数的构造函数时,您必须为子类定义一个构造函数,这就是我所做的。但是,编译器抱怨父类没有默认构造函数。

我是否可以得出结论,父类始终需要默认构造函数或无参数构造函数?如果我希望父类和子类仅具有带参数的构造函数怎么办?

JB *_*zet 4

我得出的结论是否正确:父类总是需要默认或无参数构造函数?

不。子类构造函数必须做的第一件事是调用超类构造函数之一。如果不这样做,编译器会为您调用超类的无参数构造函数。但如果超类没有的话,当然会失败。

你的代码应该是:

class Pony extends Horse {
    Pony(int age) {
        super(age);
    }
}
Run Code Online (Sandbox Code Playgroud)

看,超类已经有一个年龄字段,并且可能有使用该字段的方法。因此,在子类中重新声明一个是错误的并且会适得其反。