class Base {
public Base() {
test();
}
public void test() {
System.out.println("将被子类重写的方法");
}
}public class extends1 extends Base{ private String name;
public extends1(String name) {
this.name = name;
}
public void test() {
System.out.println("子类重写父类的方法,其name字符串长度" + name.length());
}
/**
* @param args
*/
public static void main(String[] args) {
extends1 s = new extends1("123");
}}
运行时会报空指针异常,请问是什么原因?
public Base() {
test();
}
public void test() {
System.out.println("将被子类重写的方法");
}
}public class extends1 extends Base{ private String name;
public extends1(String name) {
this.name = name;
}
public void test() {
System.out.println("子类重写父类的方法,其name字符串长度" + name.length());
}
/**
* @param args
*/
public static void main(String[] args) {
extends1 s = new extends1("123");
}}
运行时会报空指针异常,请问是什么原因?
你的父类构造中调用了test()方法,其实是调用的子类重写的test方法
而此时子类还未构造,所以空指针
我没运行,随便看了下,不知道对不对
所以在执行extends1 s = new extends1("123"); 构造时,先去执行Base的构造函数,执行test()时是执行extends1的test()而这个时候this.name=name,并未执行,即对象里面的name并没有赋值,所以name.length()就报空指针异常了。
System.out.println("子类重写父类的方法,其name字符串长度" + name.length()); 这句抛出异常
extends1 s = new extends1("123");
当你创建 extends 的时候, 会首先执行 父类的构造方法:public Base() {
System.out.println(this); //extends1@c17164
test();
}可以看到 this 指向的是 子类,
执行的test 方法 也就是 this.test() 即 子类的 构造方法:public void test() {
System.out.println("子类重写父类的方法,其name字符串长度" + name.length());
}
而此时, 子类的构造方法还没有执行, name 也就是 null所以System.out.println("子类重写父类的方法,其name字符串长度" + name.length());会报 java.lang.NullPointerException
test();
}
然后调用子类的test()方法,但是此时子类中的变量name还未来得及被赋值,为null,所以报了空引用异常