黑马程序员技术交流社区

标题: 一道多态的分析题 [打印本页]

作者: 小棽    时间: 2015-1-27 22:24
标题: 一道多态的分析题
  1. package day10.itcast02;

  2. public class DuoTaiTest3
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Fu f = new Zi();
  7.                 System.out.println("main :" +f.getNum());
  8.         }
  9. }
  10. class Fu
  11. {
  12.         int x = 4;
  13.         Fu()
  14.         {
  15.                 System.out.println("A fu() : "+getNum());
  16.         }
  17.         int getNum()
  18.         {
  19.                 System.out.println("B fu getnum run...."+x);
  20.                 return 100;
  21.         }
  22. }
  23. class Zi extends Fu
  24. {
  25.         int x = 5;
  26.         Zi()
  27.         {        //super();默认存在并调用父类的无参构造
  28.                 System.out.println("C zi() : "+getNum());
  29.         }
  30.         int getNum()
  31.         {
  32.                 System.out.println("D zi getnum run...."+x);
  33.                 return 200;
  34.         }
  35. }

复制代码
分析这道题首先从main方法开始,Fu f = new Zi(); 程序首先会调用子类的构造方法,进入到子类的构造方法时,因为在子类的构造方法中第一行都会有默认的super();调用父类的构造方法,所以程序进入到父类的构造方法之中,在父类的构造方法中,有一条输出语句,输出语句中调用了getNum()方法,那么这时候调用的是哪个呢?因为在main方法中,使用了多态,使父类的对象引用指向了子类,所以调用的是子类的getNum方法,在getNum方法中输出了一个x,因为从程序开始一直到现在都还未对x进行显示的初始化,所以x的值为0,所以最想打印的是D zi getnum run....0,接着getNum方法返回了200到父类的构造方法中,所以接着打印了A fu() : 200,当打印了两条语句之后,又回到了子类的构造方法中,这时子类的构造方法中同样有一条输出语句,在语句中调用了getNum()方法,这个getNum方法同样是子类中的方法,因为此时对子类中的x已经完成了显式初始化,所以打印了D zi getnum run....5,打印完成后又回到了子类的构造方法中执行了输出语句,此时打印了C zi() : 200,至此Fu f = new Zi()完成了所有的操作,最后mian方法中的输出语句中同样调用的是子类中的getNum()方法,所以打印的是main :200
综合以上的分析,可以得出最后的结果为:
D zi getnum run....0
A fu() : 200
D zi getnum run....5
C zi() : 200
main :200


作者: 梁小刀11    时间: 2015-1-27 23:34
谢谢分享
作者: yueye13    时间: 2015-1-27 23:45
都这么认真分析,绝对基础搞扎实了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2