java继承的一个问题

hnsywangxin 2016-11-17 10:38:30
 
class Base
{
public Base()
{
test();
}
public void test() //①号test方法
{
System.out.println("将被子类重写的方法");
}
}
public class Sub extends Base
{
private String name="继承";
public void test() //②号test方法
{
System.out.println("子类重写父类的方法,"
+ "其name字符串长度" + name.length());
}
public static void main(String[] args)
{

Sub s = new Sub();
}
}

为什么输出结果会出现空指针异常,我已经给name初始化了,但是就是一直出现这个错误
...全文
552 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluetata 2016-11-21
  • 打赏
  • 举报
回复
引用 11 楼 aAlias 的回复:
每次看到有关父类子类执行顺序的例子总要重看一遍,当时看完感觉自己知道、记住了,但是一遇到类似的,感觉又模糊了,又要看一遍
你可以看下楼上我发的博文,实验一下就明白了,不动手做不会理解那么深的
bluetata 2016-11-21
  • 打赏
  • 举报
回复
aAlias 2016-11-18
  • 打赏
  • 举报
回复
每次看到有关父类子类执行顺序的例子总要重看一遍,当时看完感觉自己知道、记住了,但是一遇到类似的,感觉又模糊了,又要看一遍
hnsywangxin 2016-11-18
  • 打赏
  • 举报
回复
引用 3 楼 Bigdicker 的回复:
你建立对象的时候,会先把父类的静态成员全部开辟空间默认初始化再通过赋值和静态初始化块的方式把父类和自己的静态成员全部初始化,接着再把父类和自己的实例成员全部开辟空间默认初始化,然后通过子类调用父类构造方法的方式,可以先把父类用构造代码块或构造方法或赋值的方式一直从父类向子类初始化下来,你通过Sub的构造方法调用父类的构造方法再调用自己的Test方法的时候,这个时候只有你父类的成员还在初始化,还没执行完所以没轮到你,只执行了默认初始化,所以是null,就出现了空指针异常,想解决直接在前面加上static 或者移到父类上去。
但是为何我在Sub类里加上private String name="继承";跟你加在方法里面不一样的结果呢
hnsywangxin 2016-11-18
  • 打赏
  • 举报
回复
引用 1 楼 so_much_ice 的回复:
public class Sub extends Base { public void test() //②号test方法 { String name="继承"; System.out.println("子类重写父类的方法," + "其name字符串长度" +name.length()); } public static void main(String[] args) { Sub s = new Sub(); }
是我看错了,可以了,但是为何我在Sub类里加上private String name="继承";跟你加在方法里面不一样的结果呢
hnsywangxin 2016-11-18
  • 打赏
  • 举报
回复
引用 1 楼 so_much_ice 的回复:
public class Sub extends Base { public void test() //②号test方法 { String name="继承"; System.out.println("子类重写父类的方法," + "其name字符串长度" +name.length()); } public static void main(String[] args) { Sub s = new Sub(); }
这个还是会有错误啊
sky_08_06_02 2016-11-18
  • 打赏
  • 举报
回复
时小E 2016-11-17
  • 打赏
  • 举报
回复
2#,3#说的非常好,要理解清楚继承关系中,代码的执行路径、初始化顺序。
qq_34537700 2016-11-17
  • 打赏
  • 举报
回复
高手,必须赞一个
Bigdicker 2016-11-17
  • 打赏
  • 举报
回复
你建立对象的时候,会先把父类的静态成员全部开辟空间默认初始化再通过赋值和静态初始化块的方式把父类和自己的静态成员全部初始化,接着再把父类和自己的实例成员全部开辟空间默认初始化,然后通过子类调用父类构造方法的方式,可以先把父类用构造代码块或构造方法或赋值的方式一直从父类向子类初始化下来,你通过Sub的构造方法调用父类的构造方法再调用自己的Test方法的时候,这个时候只有你父类的成员还在初始化,还没执行完所以没轮到你,只执行了默认初始化,所以是null,就出现了空指针异常,想解决直接在前面加上static 或者移到父类上去。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧