それは正しくありません。スーパークラスのコンストラクターは、それがデフォルトのコンストラクター (つまり、引数のないコンストラクター) である場合にのみ自動的に呼び出されます。
スーパークラスにデフォルトのコンストラクターがない場合は、選択したコンストラクターを で明示的に呼び出す必要がありますsuper(args..)
。
たとえば、BearManPig
のコンストラクターが とは異なる署名を持っているにもかかわらず、これはまったく問題ありませんAnimal
。
public class Animal {
public Animal() {
}
}
public class BearManPig extends Animal {
public BearManPig(String string) {
}
}
これは、Java がデフォルトの引数のないコンストラクターを検出したためです。
ここで、デフォルトのコンストラクターがない場合は、どのコンストラクターを呼び出すかを明示する必要があります。たとえば、これは機能しません。
// DOESN'T COMPILE
public class Animal {
public Animal(String string) {
}
public Animal(String string0, String string1) {
}
}
public class BearManPig extends Animal {
// There is no default constructor, stupid Java can't figure out what to do
public BearManPig(String string) {
}
}
しかし、これは:
// does compile
public class Animal {
public Animal(String string) {
}
public Animal(String string0, String string1) {
}
}
public class BearManPig extends Animal {
public BearManPig(String string) {
super(string); // I've told Java what to do
}
}