Java中 子、父类加载的顺序问题
2013-10-19 16:21
253 查看
Java中子父类加载的顺序问题
在论坛看到这么个问题,经过一番分析,应该是子父类加载顺序导致的问题:
别人的问题:
问结果会是什么?
其结果是:代码中 name.length()的name是null,不能点调用length(),出现空指针异常。
分析:
就是new的时候,往堆里加载子类和父类的顺序先后导致的问题。运行时,先父类往堆里加,这时子类还没进堆,子类的name还没加进堆呢,
只不过父类Test的方法,要加子类的Test(执行时动态绑定,用复写的方法),执行方法时,一看name,堆里根本没得,就是null。加载完父类,而后再加子类进堆,才执行private
String name语句,这个时候才有了name。其实调试下就知道了,先用的Test(),完了后,再到private String name语句。
小结:new子类对象时,先要加载它的父类,即父类先比子类先入堆。所以在使用复写方法时要注意哪些东西存在。
在论坛看到这么个问题,经过一番分析,应该是子父类加载顺序导致的问题:
别人的问题:
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.length()的name是null,不能点调用length(),出现空指针异常。
分析:
就是new的时候,往堆里加载子类和父类的顺序先后导致的问题。运行时,先父类往堆里加,这时子类还没进堆,子类的name还没加进堆呢,
只不过父类Test的方法,要加子类的Test(执行时动态绑定,用复写的方法),执行方法时,一看name,堆里根本没得,就是null。加载完父类,而后再加子类进堆,才执行private
String name语句,这个时候才有了name。其实调试下就知道了,先用的Test(),完了后,再到private String name语句。
小结:new子类对象时,先要加载它的父类,即父类先比子类先入堆。所以在使用复写方法时要注意哪些东西存在。
相关文章推荐
- JAVA 父类与子类初始化顺序问题
- Java继承中父类和子类的加载顺序
- 关于java内部类加载顺序的问题
- Java父类子类加载顺序
- Java笔记(十二)……类中各部分加载顺序及存放位置问题
- Java子类继承父类,构造方法的执行顺序问题
- java 静态变量 静态代码块 加载顺序问题
- 详解java中继承关系类加载顺序问题
- Java____父类、子类——构造代码块、方法调用顺序问题
- java类加载器学习2——自定义类加载器和父类委托机制带来的问题/JAVA类加载的委托模型/Java的委托
- Java中关于类加载顺序的问题
- 关于java内部类加载顺序的问题
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
- java非静态实名内部类加载顺序问题
- java 类中变量,方法加载顺序和造成的问题。
- 浅谈Java中父类与子类的加载顺序详解
- Java继承:子类和父类创建对象的顺序问题。
- java 字父类 构造方法 代码块 加载顺序
- 浅谈Java中父类与子类的加载顺序详解