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");
}}
运行时会报空指针异常,请问是什么原因?

解决方案 »

  1.   

    构造子类对象时会自动调用父类构造
    你的父类构造中调用了test()方法,其实是调用的子类重写的test方法
    而此时子类还未构造,所以空指针
    我没运行,随便看了下,不知道对不对
      

  2.   

    如果父类中没有写构造函数,或者有没有带参数的构造函数,则子类中不需要在显式调用,因为java会默认帮你添加super();这样的调用父类构造函数的语句。
      所以在执行extends1 s = new extends1("123"); 构造时,先去执行Base的构造函数,执行test()时是执行extends1的test()而这个时候this.name=name,并未执行,即对象里面的name并没有赋值,所以name.length()就报空指针异常了。
      

  3.   

    分析的对,子类在构造时,首先调用父类的构造器,父类构造器里调用test()方法实际是调用子类的test()方法,而此时name还未被赋值,所以为空.
    System.out.println("子类重写父类的方法,其name字符串长度" + name.length()); 这句抛出异常
      

  4.   

    lz 
    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
      

  5.   

    正解,因为此时的name是null,你去调用它的length()方法所以报空指针异常
      

  6.   

    走到public extends1(String name)时,构造子类对象时会自动调用父类构造,这时转到父类的构造      public Base() {
    test();
    }
    然后调用子类的test()方法,但是此时子类中的变量name还未来得及被赋值,为null,所以报了空引用异常