super
オーバーライドされていない他のメソッドを参照するためにキーワードを使用しないでください。クラスを拡張しようとする他の開発者を混乱させます。
このようsuper
にキーワードを使用するコードを見てみましょう。ここには 2 つのクラスがあります:Dog
とCleverDog
:
/* file Dog.java */
public static class Dog extends Animal {
private String name;
public Dog(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/* file CleverDog.java */
public class CleverDog extends Dog {
public CleverDog(String name) {
super(name);
}
public void rollover() {
System.out.println(super.getName()+" rolls over!");
}
public void speak() {
System.out.println(super.getName() + " speaks!");
}
}
ここで、あなたがプロジェクトの新しい開発者で、テレビに出ている賢い犬に特定の行動が必要であると想像してください。その犬はすべてのトリックを実行する必要がありますが、架空のテレビの名前で行く必要があります。これを実現するには、getName(...)
メソッドをオーバーライドします...
/* file DogOnTv.java */
public class DogOnTv extends CleverDog {
String fictionalName;
public DogOnTv(String realName, String fictionalName) {
super(realName);
fictionalName = fictionalName;
}
public String getName() {
return fictionalName;
}
}
super
...そして、元の開発者と彼らの異常なキーワードの使用によって設定された罠に陥ります!
上記のコードは機能しません。元のCleverDog
実装では、キーワードgetName()
を使用して呼び出されるためです。super
つまりDog.getName()
、オーバーライドとは関係なく、常に呼び出されます。したがって、新しいDogOnTv
タイプを使用すると...
System.out.println("Showcasing the Clever Dog!");
CleverDog showDog = new CleverDog("TugBoat");
showDog.rollover();
showDog.speak();
System.out.println("And now the Dog on TV!");
DogOnTv dogOnTv = new DogOnTv("Pal", "Lassie");
dogOnTv.rollover();
...間違った出力が得られます:
Showcasing the Clever Dog!
Tugboat rolls over!
Tugboat speaks!
And now the Dog on TV!
Pal rolls over!
Pal speaks!
super
これは、メソッドをオーバーライドするときに通常予想される動作ではないため、属さないキーワードを使用してこの種の混乱を引き起こすことは避ける必要があります。
ただし、これが実際に必要な動作である場合は、final
代わりにキーワードを使用して、メソッドをオーバーライドできないことを明確に示します。
/* file CleverDog.java */
public class CleverDog extends Dog {
public CleverDog(String name) {
super(name);
}
public final String getName() { // final so it can't be overridden
return super.getName();
}
public void rollover() {
System.out.println(this.getName()+" rolls over!"); // no `super` keyword
}
public void speak() {
System.out.println(this.getName() + " speaks!"); // no `super` keyword
}
}