Java 为什么子类中列表的字段声明使其为空?

Java 为什么子类中列表的字段声明使其为空?,java,inheritance,overriding,Java,Inheritance,Overriding,我目前有两门课程,结构如下(此处简化): A类 { private List myList=new ArrayList(); 公共A() { init(); } 公共void init() { myList.add(“苹果”); } } B类扩展了A类 { private List myList=new ArrayList(); 公共图书馆B() { 超级(); init(); } @凌驾 公共void init() { myList.add(“苹果”); } } 我注意到在A的init()中

我目前有两门课程,结构如下(此处简化):

A类
{
private List myList=new ArrayList();
公共A()
{
init();
}
公共void init()
{
myList.add(“苹果”);
}
}
B类扩展了A类
{
private List myList=new ArrayList();
公共图书馆B()
{
超级();
init();
}
@凌驾
公共void init()
{
myList.add(“苹果”);
}
}
我注意到在A的init()中,myList的大小为0,因此它可以添加“apple”。 但在B的init()中,myList为null,并且在尝试添加“apple”时抛出一个NPE

我知道这可能是一些我无法理解的基本问题,我想对此进行思考

提前谢谢

编辑:碰巧看到这个
是动态绑定吗?我已经明确声明了我的ctor,而且它是一个列表,它们不是自动初始化为空列表吗?

一般来说,子类初始化在超类初始化完成之前不会发生,以避免子类实现看到处于不一致状态的超类组件。
B
myList
字段的初始化看起来不像附加到任何构造函数,但实际上它在超类构造函数调用之后立即发生在任何
B
构造函数中。此字段与超类声明的字段完全不同

A
的构造函数尝试调用
self.init
时,它从
B
获得覆盖
B
的覆盖尝试附加到
B
中的私有
myList
字段,但该字段尚未初始化


通常最好避免在构造函数中调用可重写的方法。

“它们不会自动初始化为空列表吗”-这会在以后发生。
class A
{
  private List<String> myList = new ArrayList<>();

  public A()
  {
    init();
  }

  public void init()
  {
    myList.add("apple");
  }
}


class B extends A
{
  private List<String> myList = new ArrayList<>();
  public B()
  {
    super();
    init();
  }

  @Override
  public void init()
  {
    myList.add("apple");
  }
}