开发者社区> 问答> 正文

为什么子类中列表的字段声明使它为null?

我目前有2个具有以下结构的类(此处简化):

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");
  }
}

我观察到在A的init()中,myList的大小为0,因此它可以添加“ apple”。但是在B的init()中,myList为null,并且在尝试添加“ apple”时会抛出NPE。

我知道这可能是我无法理解的基本知识,所以我想对此进行总结。

提前致谢。


问题来源:stackoverflow

展开
收起
七天一失眠 2020-03-28 11:14:52 829 0
1 条回答
写回答
取消 提交回答
  • 做一个优秀的阿里云志愿者

    常,直到超类初始化完成后才进行子类初始化,以避免子类实现看到超类组件处于不一致状态。初始化B的myList现场看起来并不像它连接到任何的构造函数,但它实际上发生在任何B超类构造函数调用后立即构造。该字段是与超类声明的字段完全独立的字段。

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

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


    答案来源:stackoverflow

    2020-03-28 11:15:13
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载