zoukankan      html  css  js  c++  java
  • 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的值。

  • 相关阅读:
    JVM字节码-字节码进阶
    JVM字节码-Class文件结构
    CT03 Contest#10 equation 大力打表+讨论
    2021CT03 Contest#9 降智场
    妙妙题 noi.ac 2323 Connecting
    洛谷 P4774 [NOI2018] 屠龙勇士
    [模板] 扩展中国剩余定理
    洛谷 P1082 [NOIP2012 提高组] 同余方程
    洛谷 P1516 青蛙的约会
    2021牛客暑期多校训练营3 Kuriyama Mirai and Exclusive Or
  • 原文地址:https://www.cnblogs.com/huashui/p/3250789.html
Copyright © 2011-2022 走看看