- Java code
public class A { int x=1; public A(){ //this.x=1; System.out.println(this.x); System.out.println(this.getClass()); print(); } void print(){ System.out.println("A:"+this.x); }}public class B extends A { int x=2; public B(){ System.out.println(this.x); System.out.println(this.getClass()); print(); } void print(){ System.out.println("B"+this.x); }}public class Test { public static void main(String[] args) { A b=new B(); B c=new B(); System.out.println(b.x); System.out.println(c.x); }}
运行结果:
1
class test02.B
B:0
2
class test02.B
B:2
1
class test02.B
B:0
2
class test02.B
B:2
1
2
请各位高手帮我看看,实在是看不明白为什么是这样
------解决方案--------------------
下次请你把输出格式规范一下。看的我眼都花了。
我给你解释一下这是为什么。
先说 A b=new B();情况。
首先因为B是继承自A。当创建new B()时。根据初始化顺序。
首先开始初始化A。
1、为A开辟一块内存空间,将内存空间清空。(在A中定义的所有变量变为0以及null),对B执行同样操作
2、初始化A所有的静态方法以及静态变量。
3、初始化B所有的静态方法以及静态变量。
4、开始初始化A所有的变量
4、开始调用A的构造方法(因为B继承自A。在B的内部隐藏维护了一个A的对象)。
执行System.out.println(this.x);
因此打印出
1
然后执行
System.out.println(this.getClass());
由于是调用的方法。根据动态绑定。因此该方法被捆绑到了B对象。调用的就是B的getClass();
因此打印出
class test02.B
然后调用
print();方法。仍然是动态绑定。因此实际调用的是B中的print()方法。注意我第一条说的。
这个时候只是给B分配了内存空间,并且清零操作。但是没有真正的初始化变量。因为所有的变量值为0或者Null。
因此打印出
B:0
----------------------------------------------
然后开始对B执行初始化操作。
然后调用构造方法。B这里就不用解释了。
因此打印出
2
class test02.B
B:2
--------------------------------------------
B c=new B();我也就不用说了。自己推导即可。
System.out.println(b.x);
System.out.println(c.x);
同样也不想说了。