黑马程序员技术交流社区

标题: 请大家帮忙看下下面这个程序的结果为什么是这样的,谢... [打印本页]

作者: 杜成龙    时间: 2013-6-1 07:36
标题: 请大家帮忙看下下面这个程序的结果为什么是这样的,谢...
本帖最后由 杜成龙 于 2013-6-1 16:12 编辑
  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.      public static void main(String[] args)
  12.     {
  13.           int i=0;
  14.           Fu p=new Fu();
  15.           Fu f=new Demo();
  16.           Demo d=new Demo();
  17.           for(f.show('A');p.show('B')&&(i<2);f.show('C'))
  18.             {
  19.                   i++;
  20.                  d.show('D');
  21.             }
  22.     }
  23.     boolean show(char a)
  24.     {
  25.           System.out.println(a);
  26.            return false;
  27.     }

  28. }
复制代码
显示的结果是:ABDCBDCB, 怎么会显示这个结果呢?

作者: yooc    时间: 2013-6-1 08:19
  1.     for(f.show('A');p.show('B')&&(i<2);f.show('C'))
  2.             {
  3.                   i++;
  4.                  d.show('D');
  5.             }

  6. /*
  7. 假定ABCD代表for语句的4个部分。
  8. for首先执行初始化语句 打印A
  9. 然后执行判断语句      打印B    此时I=0
  10. 满足条件,执行主语句  打印D
  11. 主语句结束执行C部分   打印C

  12. 开始循环 执行判断语句 打印B    此时I=1
  13. 满足条件,执行主语句  打印D
  14. 主语句结束执行C部分   打印C


  15. 开始循环 执行判断语句 打印B    此时I=2
  16. 不满足条件,for语句结束。


  17. 显示的结果是:ABDCBDCB
  18. */
复制代码

作者: 小石头39910    时间: 2013-6-1 08:23
我总觉得缺少一个判断语句

class Demo extends Fu
{
     public static void main(String[] args)
    {
          int i=0;
          Fu p=new Fu();//创建父类对象
          Fu f=new Demo();//父类的引用创建了子类对象转到for循环
          Demo d=new Demo();//子类创建了对象,转到for循环
          for(f.show('A');p.show('B')&&(i<2);f.show('C'))
            {
                  i++;//i=1;i=2//ABDCBDCB  
                 d.show('D');//第一次for循环的顺序是for(1;2;3)先执行1和2满足的话执行for循环里面的所以
                             //f.show()打印A,p.show()打印B,然后执行d.show()打印D再执行f.show()打印c
            }
    }                        //第二次循环没有f对象就不初始化不访问f.show(),访问p.show()打印B,接着访问d.show()
                             //打印D,然后访问f.show()打印C,第三次只有父类有对象,只能访问p.show();i<2不满足就不在往下执行了
    boolean show(char a)
    {
          System.out.println(a);
           return false;
    }
}

作者: 张俊迪    时间: 2013-6-1 08:24
在for循环语句中例如for(A;B;C)其中A一般是初始化语句因此只执行一次,C是在循环语句结束后才进行操作,B放的的判断语句,对于本题 for(f.show('A');p.show('B')&&(i<2);f.show('C')) { i++; d.show('D'); }for.show('A')先执行然后执行p.show('B')因为他的返回语句是true所以会接着进行判断i<2,下面进行循环体,i++,然后show('D'),在运行show('C');循环玩一次因为show('A')在初始化地方所以不会在执行,直接运行show('B')下面就一样了,最后一次循环完之后,接着会运行判断模块这时候打印B,但是如果把show('B')和i<2换一下位置就不会运行show('B')了。本题可以改一下把fu类中的返回值改成false结果为AB,这要用到&&的计算规律
作者: 赵乐    时间: 2013-6-1 08:52
本帖最后由 赵乐 于 2013-6-1 08:57 编辑


作者: 闫月乐    时间: 2013-6-1 09:53
class Fu
{
      boolean show(char a)
      {
           System.out.println(a);
           return true;
      }

}

class Demo extends Fu
{
     public static void main(String[] args)
    {
          int i=0;
          Fu p=new Fu();//建立父类对象,
          Fu f=new Demo();//建立父类引用指向子类对象,是多态在程序中的体现形式
                  //多态中成员的特点:非静态成员方法,编译看左边,运行看右边  其他情况,编译运行都看左边
          Demo d=new Demo();//建立子类对象
          for(f.show('A');p.show('B')&&(i<2);f.show('C'))
                /*
                        1,f.show('A')运行时看等号右边,即Demo类中的show方法,打印A,返回false(初始化语句的返回没啥用)
                        2,执行判断语句,p.show('B'),父类对象直接调用父类中的show,打印B,返回true,
                        &&双与时,两边同为真,才为真,此时i=0<2,满足判断语句,执行for循环中的内容
                        3,i++,i=1,执行d.show('D');直接调用子类中的show,打印D,返回false
                        4,执行循环操作表达式f.show('C'),和第一步一样,打印C,返回false.
                        5,执行判断语句,即重复2步骤,打印B,此时i=1<2,执行for循环中的内容
                        6,执行3步骤,打印D,此时i++后,为2
                        7,重复4步骤,打印C
                        8,重复2步骤,打印B,而此时i=2不满足i<2条件,跳出循环!!
                          故:打印顺序为A,B,D,C,B,D,C,B
                         其实只要明白多态和for循环的特点,然后一步一步慢慢来就好,多态的特点前期只要记住就好,不用过深研究

                */
            {
                  i++;
                 d.show('D');
            }
    }
    boolean show(char a)
    {
          System.out.println(a);
           return false;
    }
}

作者: 王浩骅    时间: 2013-6-1 11:00
for(f.show('A');p.show('B')&&(i<2);f.show('C'))
            {
                  i++;
                 d.show('D');
            }
看这个for循环语句,在for中第一个;前的是初始化语句,在第一次循环时执行,即f.show('A');因为f是父类引用指向子类对象,所以调用了子类的show方法,但是,这句只是初始化false并没有起作用,A被打印出来。进行到第二个;前,此时p.show进行的是调用父类的方法,并返回true,调用show打印了B。而此时在&&两端都是true所以,打印for循环内的语句,输出D。之后运算第三个;前的语句,打印了C。
第二轮循环,初始化语句就跳过,所以f.show("A")被跳过。执行第二;前的语句,输出B,然后上例输出了D,C
当执行到第三轮的时候,初始化语句跳过,执行第二;前语句,输出了B,但是此时由于前两次i++,此时i已经等于2不满足于条件所以不继续运行跳出循环。
总结下来就是打印了ABDCBDCB




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