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