不要使用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
實現中,使用super
關鍵字調用getName()
。這意味着它總是調用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
}
}
好去處(這只是我寫了一個例子作爲問題的一部分)。會員現在更新並設置爲私人。 – Jonny