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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 橸瑩膤漃寞林 中级黑马   /  2014-4-7 22:19  /  1830 人查看  /  12 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

4.
写出程序结果       
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 f=new Demo();
                Demo d=new Demo();
                for(f.show('A'); f.show('B')&&(i<2);f.show('C'))
                {
                        i++;
                        d.show('D');
                }       
        }
        boolean show(char a)
        {
                System.out.println(a);
                return false;
        }
}
A B

12 个回复

正序浏览
此代码主要考点在多态和运算符上。首先Demo继承Fu类,对象f是Fu类引用子类Demo的实例,当调用方法时,是调用子类Demo中的方法,所以结果是A,false;for循环中,f.show("B")结果也是B,false,而&&运算符,只要一边是false,则结果是false,所以for循环中for(false,false),循环不会被执行,程序运行结束,所以最终输出结果是:
A
B
回复 使用道具 举报
代码中 Fu f = new Demo()父类引用指向了子类对象,当你调用某个方法时它会先在子类中寻找,没有的话才去父类中寻找。因为你在子类中重写了父类中的show方法,所以你调用的都是子类中的show方法。
for(f.show('A'); f.show('B')&&(i<2);f.show('C'))这段代码执行的结果就是输出A,返回false;输出B,返回false;f.show('B')&&(i<2)的结果是false,所以for循环结束。
回复 使用道具 举报
哈哈,你们都感谢我吧,是我给版主留言 进来看的,
回复 使用道具 举报
for(f.show('A'); f.show('B')&&(i<2);f.show('C'))
                {
                        i++;
                        d.show('D');
                }  
f.show('A');  调用
        boolean show(char a)
        {
                System.out.println(a);    //打印A  并且返回false。
                return false;   
        }
f.show('B'); 调用
        boolean show(char a)
        {
                System.out.println(a); //打印B,返回false。判断表达式为假,循环体不执行。
                return false;              //所以执行结果是 A  B
        }

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
版主为什么还不来给我加技术分啊,我是第一个回答对的啊:(
回复 使用道具 举报
程序运行到for时,f.show('A')调用的子类的show方法所以第一个输出A,返回false。然后运行f.show('B'),也是调用子类的show方法,输出B,返回false。
这时由于for不满足条件了所以会退出for循环,程序结束
回复 使用道具 举报
这个很简单啊,只要理解循环体执行顺序,一步一步看,就会得到答案的;
for(A;B;C)假设这三个表达式,A--〉B--〉循环体--〉C--〉B--〉循环体--〉C--
头两步执行完,判断为条件判断为false,循环体不执行,所以输出A  B

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
楼上说得没错,就是"父类引用指向子类对象",父类那个show方法根本没用到。
楼主你把下面的程序复制到你的IDE运行一下就好理解了。

  1. package com.itheima;

  2. class Fu {
  3.         boolean show(char a) {
  4.                 System.out.println(a);
  5.                 return true;
  6.         }
  7. }

  8. class Demo extends Fu {
  9.         public static void main(String[] args) {
  10.                 int i = 0;
  11.                 Fu f = new Demo();
  12.                 Demo d = new Demo();
  13.                 for (f.show('A'); f.show('B') && (i < 2); f.show('C')) {
  14.                         System.out.println("Show_Fu");
  15.                         i++;
  16.                         d.show('D');
  17.                 }
  18.                 System.out.println(i);
  19.         }

  20.         boolean show(char a) {
  21.                 System.out.println("Show_Demo");
  22.                 System.out.println(a);
  23.                 return false;
  24.         }
  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
class Fu
{
        boolean show(char a)
        {
                System.out.println(a);
                return true;
        }
}
class Demo extends Fu //Demo继承了Fu类,并复写了Fu类的show方法
{
        public static void main(String[] args)
        {
                int i=0;
                Fu f=new Demo();  //父类引用指向了子类对象,这就是传说中的多态啊!
                Demo d=new Demo();
                for(f.show('A'); f.show('B')&&(i<2);f.show('C'))
                {
                        i++;
                        d.show('D');
                }        
        }
        boolean show(char a)  //复写了父类的show方法
        {
                System.out.println(a);
                return false;
        }
}

分析:
1、f其实指向了一个Demo对象,所以其show方法其实调用的是Demo类中的show方法,返回的是true。
2、要明确for循环的执行顺序:
     for(A ; B ; C)
     {   D;     }
     执行的顺序是:A-->判断B条件是否满足--->(如果满足)D-->C-->再判断B--->(如果满足)D-->C-->。。。。再判断B--->(如果不满足)退出循环
3、按照2中所叙的顺序进行分析。
①执行f.show('A'),输出A;
②执行f.show('B') ,输出B,但是注意,此时这个f.show方法调用的是Demo类的show方法,返回了false。
③根据&&的短路规则,由于&&左边的f,show('B')返回了false,整个条件表达式结果为false,即条件不满足,退出for循环。

程序的执行顺序就是这样啦。希望能够帮到你哟。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
for(f.show('A'); f.show('B')&&(i<2);f.show('C'))
f.show('A')  ,f调用的是Demo自己的show方法,打印A,返回false
f.show('B'),f调用的仍然是Demo自己show方法,打印B,返回false,因为两个布尔表达式用&&连接,&&属于短路与符号,所以并不会执行后面的语句,for循环里面的语句也不会执行,所以最终输出的是AB

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
对啊,就是 A B
你执行到 for(f.show('A'); f.show('B')&&(i<2);f.show('C')) 开始有输出
先执行初始化语句 f.show('A'); 输出 A ,而 f.show('A') = false, (f指向的是子类对象,show()被重写,返回值是 boolean 型变量 false)
然后执行判断 f.show('B')&&(i<2); 先输出 B , 而 f.show('B') = false,
所以判断语句的结果是 false ,退出循环,执行主程序隐藏的 return; ,程序结束
结果输出就是 A B

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 ilvsoft 于 2014-4-7 22:34 编辑

因为你子类Demo对父类Fu的方法show()重写了,
所以再for里面f.show('A')的结果是 A 和false
同样          f.show('B')的结果也是B 和false
            而for的条件中就变成false&&i<2的是false,所以循环体不执行

最终答案就A   B

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马