请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 385|回复: 4

空指针异常

[复制链接]
发表于 2018-4-16 16:17:41 | 显示全部楼层 |阅读模式
class Base
{
public Base()
{
test();
}
public void test()
{
System.out.println("将被子类重写的方法");
}
}
public class Sub extends Base
{
private String name;
public void test()
{
System.out.println("子类的方法 重写了父类"+name.length());
}
public static void main(String [] args)
{
Sub s=new Sub();
}
}

cmd java Sub 提示空指针异常
然后我把private String name; 改成private String name="李刚"; 还是提示空指针异常 请教是什么原因 谢谢
发表于 2018-4-16 21:23:50 | 显示全部楼层
我也看到这了,说一下我的理解。当你创建这个对象时,这个类还没被加载,所以先去加载初始化这个类,上溯到Base类中,调用构造函数,然后调用被重写的test()方法,但是,这个时候类都没加载完,更没有给对象分配空间,也不存在什么name变量,所以test()方法中就产生异常。
不知道我理解的对不对,往大神来解惑。
发表于 2018-4-17 04:13:26 | 显示全部楼层
2L说的不太对(可能我对你的表述不太确定)。

你这个问题的关键在于:Base类的构造器调用的test()方法被子类重写了——如果你的子类不重写这个方法,程序就没有问题,这也是我一直告诫的问题。

当你的子类创建实例时,子类构造器一定要会调用父类构造器(请参见《疯狂Java讲义》5.6节),
因此程序创建Sub实例时,会先调用Base默认的构造器。

当程序在创建Sub对象的过程中调用Base默认的构造器时,此时的执行上下文是Sub类,因此Base构造器中调用的test()方法会表现为子类特征、即被重写后的test()方法(请参见《疯狂Java讲义》5.7节)。
此时,程序还没有开始构建Sub对象,因此执行Sub类中的test()方法方法就导致了NPE。
 楼主| 发表于 2018-4-17 11:09:01 | 显示全部楼层
搞懂了 就是类的初始化步骤的问题  
父类静态代码块 --> 2.子类静态代码块 -->
3.父类成员变量赋默认值 -->4.父类非静态代码块 -->5.父类构造 -->
6.子类成员变量赋默认值 -->7.子类非静态代码块 -->8.子类构造
发表于 2018-4-21 17:14:31 | 显示全部楼层
父类中调用了一个test()方法,但是你并没有定义这个方法,不就空指针了么。和String没关系,String不赋值也是默认Null;不会空指针
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2018-12-13 02:30 , Processed in 0.314837 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表