在网上看到一篇面试题,题目如下:
写出下列代码的运行结果:
1 public class DispatchTest { 2 public static void main(String[] args) { 3 Base b = new Sub(); 4 System.out.println(b.x); 5 } 6 } 7 8 class Base { 9 int x = 10; 10 11 public Base() { 12 this.printMessage(); 13 x = 20; 14 } 15 16 public void printMessage() { 17 System.out.println("Base.x = " + x); 18 } 19 } 20 21 class Sub extends Base { 22 int x = 30; 23 24 public Sub() { 25 this.printMessage(); 26 x = 40; 27 } 28 29 public void printMessage() { 30 System.out.println("Sub.x = " + x); 31 } 32 }
通过debug来分析这段代码:
step①:
step②:
第二步虽然先到了Sub类的构造器,但是下一步是去了父类Base的构造器。
step③:
step④:
第四步是去初始化父类的x变量。
step⑤:
接下来开始执行子类Sub的printMessage()方法,因为Sub类覆盖了父类Base的printMessage方法。
因为子类Sub的x变量还没有初始化,所以输出0.
step⑥:
接下来开始初始化父类Base的x对象。
step⑦:
下面开始转到子类Sub的初始化:
先初始化子类Sub的x变量。
step⑧:
开始执行Sub的printMessage方法:
因为上一步已经初始化过了Sub的x变量,所以输出30.
step⑨:
接下来修改Sub的x变量的值。
step⑩:
最后,输出b的x值,因为变量不具有多态性,所以,输出的是Base下面的x的值。