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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 騛鹏 中级黑马   /  2013-3-15 23:08  /  1619 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 騛鹏 于 2013-3-16 01:01 编辑
  1. class Fu
  2. {
  3. boolean show(char a)
  4. {
  5. System.out.println(a);

  6. return true;
  7. }
  8. }
  9. class Demo extends Fu
  10. {
  11. boolean show(char a)
  12. {
  13. System.out.println(a);

  14. return false;
  15. }
  16. public static void main(String[] args)
  17. {
  18. int i = 0;

  19. Fu f = new Demo();
  20. Demo d = new Demo();

  21. for (f.show('A'); f.show('B')&&(i<2); f.show('C'))
  22. {
  23. i++;
  24. d.show('D');
  25. }
  26. }

  27. }
复制代码
打印结果: A B    。
f.show('B')&&(i<2); 为真时  为何没有执行循环体?

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

6 个回复

倒序浏览
因为子类复写了父类的show方法,所以多态f变量,或者是d变量,调用show方法时都执行的是子类的show方法,执行循环体的时候for (f.show('A'); f.show('B')&&(i<2); f.show('C'))时,f.show('A')打印A字符,f.show('B')打印B字符,并返回false,由于&&是短路运算符,如果前面为false,后面就不在执行,循环体结束,所以只打印AB。
回复 使用道具 举报
f.show('B')&&(i<2)是假吧?Fu f = new Demo()是多态,f.show('B')执行的结果是输出'B',返回false,判断条件也就为假了
回复 使用道具 举报
你这f.show('B')得到的结果就是false。执行的过程是这样的:
Fu f = new Demo();父类的引用指向子类的对象,因为子类重写了父类的方法,所以f.show('A')执行的是子类的show方法,打印结果是A;
再接着f.show('B')也是执行子类的show方法,返回的值是false,因为是短路与,后面的i<2不会被执行,整个循环也结束,代码运行结束。

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
Fu f = new Demo();这个是多态的使用
f.show('B')就相当于new Demo().show('B');所以返回false。循环条件不符合,循环结束。
回复 使用道具 举报
for (f.show('A'); f.show('B')&&(i<2); f.show('C'))
1,执行f.show('A'); 因为Fu f = new Demo();  父类引用指向子类对象,子类重写show()方法,执行子类Demo的show()方法,返回false  打印 A
2,执行f.show('B');    同理  返回false,打印 B   &&  短路,&&)&&(i<2); f.show('C'不执行,循环条件不满足,不执行。
所以最后打印:
A
B
主要是Fu f = new Demo();执行的是子类重写的方法。

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
騛鹏 中级黑马 2013-3-16 00:04:57
7#
多谢 楼上各位 明白了 f.show()执行的是子类的方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马