A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小棽 中级黑马   /  2015-1-27 22:24  /  874 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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

评分

参与人数 2黑马币 +30 收起 理由
晓染霜林 + 20 赞一个!
fantacyleo + 10 感谢分享

查看全部评分

2 个回复

倒序浏览
谢谢分享
回复 使用道具 举报
yueye13 来自手机 中级黑马 2015-1-27 23:45:18
藤椅
都这么认真分析,绝对基础搞扎实了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马