Step by step 分析多态

在网上看到一篇面试题,题目如下:

写出下列代码的运行结果:

 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的值。

posted @ 2013-08-10 22:25  画水  阅读(329)  评论(0编辑  收藏  举报