不要使用
super关键字来引用其他未被覆盖的方法。这会使其他尝试扩展您的类的开发人员感到困惑。
让我们看一些 确实
super以这种方式使用关键字的代码。在这里,我们有2类:
Dog与
CleverDog:
public static class Dog extends Animal { private String name; public Dog(String name) { this.name = name; } public String getName() { return name; }}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(...)方法…
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关键字-清楚地表明该方法不能被覆盖:
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 }}


