[英]Calling an abstract method in super class's construtor in Java
由於子類尚未構造,在超類構造函數中調用抽象方法是不安全的嗎?
但是,如果方法的行為不依賴於子類的構造,例如只返回關於子類的常量,它是否仍然不安全或者它是否可靠地工作?
而且,如果它有效,如果我不想讓超類抽象怎么辦呢?
更新:最后一個問題
public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}
public String getValue() {
return "superclass";
}
public static void main(String[] args) {
new SubClass();
}
}
class SubClass extends SuperClass {
public SubClass() {
super(); // Comment out this or not will not affect the result
}
public String getValue() {
return "subclass";
}
}
我寫了一個測試,並弄明白:結果是: subclass
感謝@Tim Pote的例子。
通常(但不一定)認為它是不安全的。 正如您所說,超類可能沒有完全構造,因此不會准備好處理子類在其重寫方法中可能進行的所有調用。
但是,如果所有子類只返回一個不依賴於任何其他方法的常量,那么它應該沒問題。 唯一的缺點是您不能保證子類將以適當的方式覆蓋該方法。
關於你的最后一個問題:這不是抽象與具體超類的問題。 這是在構造函數中調用可覆蓋方法的問題。 抽象與具體是不重要的。
編輯以回應OP的評論
我不確定你的“多態性”是什么意思。 調用虛方法總是調用最多的實現。 調用超類實現的唯一時間是通過super
關鍵字。 例如:
public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}
public String getValue() {
return "superclass";
}
public static void main(String[] args) {
new SubClass();
}
public static class SubClass extends SuperClass {
public String getValue() {
return "subclass";
}
}
}
打印subclass
。
還有這個:
public class SuperClass {
public SuperClass() {
System.out.println(getValue());
}
public String getValue() {
return "superclass";
}
public static void main(String[] args) {
new SubClass();
}
public static class SubClass extends SuperClass {
public String getValue() {
return super.getValue() + " subclass";
}
}
}
打印superclass subclass
正如其他人所解釋的那樣,在超類構造函數中調用抽象方法存在固有的風險。
我發現的一個例外是當子類提供一些“常量”信息時,例如getId()
, getHandledMessages()
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.