首先上实例:
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并未初始化,因此会出现空指针异常
备注:继承关系中,父类与子类各部分初始化顺序如下:
父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 ->父类普通变量 -> 父类普通代码块 -> 父类构造器 ->子类普通变量 -> 子类普通代码块 -> 子类构造器