簡體   English   中英

在Java中用超類的construtor調用抽象方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM