Java编码规范:不要在父类构造方法中调用可能被子类复写的方法

首先上实例:

public class NullPointInExtendsTest {
    public static void main(String[] args){
        son1 s = new son1();
    }
}
class parent1 {
    parent1(){
        test();
    }
    public void test(){
        System.out.println("parent1 test()");
    }
}
class son1 extends parent1 {
    String name;
    son1() {
        super();
        name = "son1";
    }
    @Override
    public void test() {
        System.out.println("son1 test()");
        name.toUpperCase();
    }
}

代码运行结果抛一个空指针异常:

son1 test()
Exception in thread "main" java.lang.NullPointerException
    at ExtendsParentSon.son1.test(NullPointInExtendsTest.java:25)
    at ExtendsParentSon.parent1.<init>(NullPointInExtendsTest.java:10)
    at ExtendsParentSon.son1.<init>(NullPointInExtendsTest.java:19)
    at ExtendsParentSon.NullPointInExtendsTest.main(NullPointInExtendsTest.java:5)

Process finished with exit code 1

原因分析:
根据子父类初始化顺序,父类构造器在子类普通变量之前调用,而父类构造器调用了test方法,又被子类覆盖,在运行是会执行子类test,而此时name并未初始化,因此会出现空指针异常
备注:继承关系中,父类与子类各部分初始化顺序如下:
父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 ->父类普通变量 -> 父类普通代码块 -> 父类构造器 ->子类普通变量 -> 子类普通代码块 -> 子类构造器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容