当我尝试做类似的事情时,我有一个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之前实例化列表,我认为将它实例化为&#34; aMethod&#34;是不合适的。
答案 0 :(得分:2)
这说明了通过超类构造函数中的多态来调用子类方法的危险。
您的B
构造函数显式调用A
的构造函数,调用aMethod
。但此时,B
中的任何内容都尚未初始化,因此list
仍为null
。这会导致NullPointerException
。 Java不会在调用超类构造函数完成之后初始化实例变量。
解决此问题的最佳方法是将列表的初始化移动到构造函数中:
方法:
super();
list.add("Something"); // No more NullPointerException
最好不要调用可以在构造函数中重写的方法,因为在superlcass构造函数中,对象的子类部分尚未初始化。