K男:
私はこのコードをコンパイルすることができません。
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;
}
}
私は、親クラスがパラメータのみを持つコンストラクタを持っているときに、子クラスのコンストラクタを定義する必要があります知っている、そしてそれは私がやっていることです。しかし、コンパイラは、親クラスにはデフォルトコンストラクタを持っていないと文句を言い。
アム私は右の親クラスは常にデフォルトまたは引数なしのコンストラクタが必要であると結論するには?私は親と子のクラスはパラメータのみを持つコンストラクタを持っているしたい場合は?
JB Nizet:
アム私は右の親クラスは常にデフォルトまたは引数なしのコンストラクタが必要であると結論するには?
第サブクラスのコンストラクタがしなければならない最初の事は、スーパークラスのコンストラクタのいずれかを呼び出すことです。そうしないと、コンパイラはあなたのためのスーパークラスの引数なしのコンストラクタを呼び出します。しかし、スーパークラスが1つを持っていない場合は失敗し、もちろん。
あなたのコードは次のようになります。
class Pony extends Horse {
Pony(int age) {
super(age);
}
}
スーパークラスはすでに、おそらくそのフィールドを使用する方法をageフィールドを持ち、そして、参照してください。だから、サブクラスで1を再宣言することは間違っていると、逆効果です。