如何将成员用于超级构造函数中调用的覆盖方法

时间:2014-10-09 20:40:46

标签: java inheritance nullpointerexception override

当我尝试做类似的事情时,我有一个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;是不合适的。

1 个答案:

答案 0 :(得分:2)

这说明了通过超类构造函数中的多态来调用子类方法的危险。

您的B构造函数显式调用A的构造函数,调用aMethod。但此时,B中的任何内容都尚未初始化,因此list仍为null。这会导致NullPointerException。 Java不会在调用超类构造函数完成之后初始化实例变量。

解决此问题的最佳方法是将列表的初始化移动到构造函数中:

方法:

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

最好不要调用可以在构造函数中重写的方法,因为在superlcass构造函数中,对象的子类部分尚未初始化。