我目前有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
常,直到超类初始化完成后才进行子类初始化,以避免子类实现看到超类组件处于不一致状态。初始化B的myList现场看起来并不像它连接到任何的构造函数,但它实际上发生在任何B超类构造函数调用后立即构造。该字段是与超类声明的字段完全独立的字段。
当A构造函数尝试调用时self.init,它将从中获取重写B。B的覆盖尝试附加到中的私有myList字段B,但该字段尚未初始化。
通常最好避免在构造函数中调用可重写方法。
答案来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。