黑马程序员技术交流社区

标题: for( ; ; ) 代码分析 [打印本页]

作者: 騛鹏    时间: 2013-3-15 23:08
标题: for( ; ; ) 代码分析
本帖最后由 騛鹏 于 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); 为真时  为何没有执行循环体?

作者: 杨剑    时间: 2013-3-15 23:17
因为子类复写了父类的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。
作者: 孙宁    时间: 2013-3-15 23:19
f.show('B')&&(i<2)是假吧?Fu f = new Demo()是多态,f.show('B')执行的结果是输出'B',返回false,判断条件也就为假了
作者: 黑马-郑玉元    时间: 2013-3-15 23:20
你这f.show('B')得到的结果就是false。执行的过程是这样的:
Fu f = new Demo();父类的引用指向子类的对象,因为子类重写了父类的方法,所以f.show('A')执行的是子类的show方法,打印结果是A;
再接着f.show('B')也是执行子类的show方法,返回的值是false,因为是短路与,后面的i<2不会被执行,整个循环也结束,代码运行结束。
作者: 黑马李超    时间: 2013-3-15 23:21
Fu f = new Demo();这个是多态的使用
f.show('B')就相当于new Demo().show('B');所以返回false。循环条件不符合,循环结束。
作者: 黑马17期-闫东东    时间: 2013-3-15 23:27
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();执行的是子类重写的方法。


作者: 騛鹏    时间: 2013-3-16 00:04
多谢 楼上各位 明白了 f.show()执行的是子类的方法




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