- public class ExtendsTest
- {
- public static void main(String[] args)
- {
- B b = new B();
- }
- }
- class A
- {
- int num = 5;
-
- A()
- {
- show();
- }
-
- public void show()
- {
- System.out.println("A"+num);
- }
- }
- class B extends A
- {
- int num = 10;
-
- B()
- {
- super();
- show();
- return;
- }
-
- public void show()
- {
- System.out.println("B"+num);
- }
- }
复制代码
有看到我改的B的构造函数么,首先,你要明确 在子类中构造函数肯定会访问 父类的空参的构造函数(指定的父类的构造函数另当别论了),也就是 super()这一步,当A B 加载进内存时 在代码区域,你new了一个B 时会访问到A的空参的构造函数,这个时候堆内存中 B的情况 是 num并没有显示初始化,而是默认初始化,也就是说这个时候 B的 num 的值默认是 0,此时访问到的A的构造函数中调用了 show()方法,而在B中已经重写了A的此方法,也就是说其实调用的是B的show()方法,这个时候输出自然是 B0 了,只有当 super() 即父类初始化完毕了,才进行子类的成员变量的显示初始化, super() 就是一个分水岭,这一步结束了,num的值立刻就被显示初始化变成 10 (这一步的显示初始化紧紧跟着super()),之后再调用 show(),这就不用多说了吧, 输出 B10,是一定的啦。。呼呼,,
真心欢迎大神指出理解中的错处,谢谢了 |