簡體   English   中英

如何在超級構造函數中調用的重寫方法中使用成員

[英]How to use a member into an override method called in the super constructor

我嘗試執行類似操作時遇到NullPointerException:

class A {

  public A() {
    aMethod();
  } 

  public void aMethod() {
    //Some stuff
  }

}

class B extends A {

  List<String> list = new ArrayList<String>

  public B() {
    super();
  }

  @Override
  public void aMethod() {
    super.aMethod();
    list.add("Something"); //NullPointerException
  }

}

我無法在構造函數中調用super之前實例化該列表,並且我認為將其實例化為“ aMethod”是不合適的。

這說明了從超類構造函數通過多態性調用子類方法的危險。

您的B構造函數顯式調用A的構造函數,后者調用aMethod 但是此時, B任何內容都尚未初始化,因此list仍然為null 這導致NullPointerException 直到對超類構造函數的調用完成之后,Java才會初始化實例變量。

解決此問題的最佳方法是將列表的初始化移動到構造函數中:

方法:

super();
list.add("Something"); // No more NullPointerException

最好也不要調用可在構造函數中覆蓋的方法,因為在superlcass構造函數中,對象的子類部分尚未初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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