Java中子父类加载的顺序问题
在论坛看到这么个问题,经过一番分析,应该是子父类加载顺序导致的问题:
别人的问题:
问结果会是什么?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子类对象时,先要加载它的父类,即父类先比子类先入堆。所以在使用复写方法时要注意哪些东西存在。