黑马程序员技术交流社区

标题: 继承、复写、以及多态 [打印本页]

作者: 吴涛    时间: 2014-3-2 20:10
标题: 继承、复写、以及多态
本帖最后由 吴涛 于 2014-3-4 12:15 编辑

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,欢迎大家发表意见
作者: 方青木    时间: 2014-3-2 20:32
Demo类继承了Fu类,并且复写了Fu类中的show()方法。
主函数Fu f=new Demo();此处为多态,父类的引用指向了子类对象
上述for循环中for(f.show('A');f.show('B')&&(i<2);f.show('C'))因为Fu类中有show()方法所以编译可以通过
但是在执行是调用的却是子类 Demo中的show()方法,所以
f.show('A')输出一次A
f.show('B')输出一次B,并返回false,for循环结束。
所以结果为A、B
作者: 行如止水    时间: 2014-3-2 22:06
你注意到f调用的show方法是子类的方法,而子类的show方法返回false,这就直接导致无法进入循环,因此只输出了AB
作者: 天凌蓝    时间: 2014-3-2 22:18
子类Demo继承父类Fu,覆写了父类的show方法,其返回值为假,主函数通过多态Fu f=new Demo();将子类对象的引用传递给f,在循环中,f调用的是子类的show方法,所以当for循环时,for(循环变量初始化 ; 循环条件判断 ;循环变量改变值),故循环变量初始化时,打印了A,从而进入条件判断f调用show打印了B,打印后返回false,经短路与(&&)判断,条件不成立退出循环。
作者: chenfc8578    时间: 2014-3-2 22:19
进入for循环时,f.show('A')就是循环的初始值,输出A。无论返回true或false都要去判断循环条件,之后执行for循环的循环条件,f.show('B')这时返回为false输出B。因为&&运算符是左边为假右边就不执行了,既然循环条件返回false循环就结束了。所以输出A,B
作者: Amorvos    时间: 2014-3-2 22:24
for循环三个参数,都是什么意思,请问楼主清楚吗?
第二个参数起判断作用,你既然知道是多态,那么f.show('B')返回的是false,那么这个for循环根本不会执行。因此只会输出AB。
楼主不要贪多,基础很重要,你的基础语法规则还有待提高,不要想当然
作者: osully    时间: 2014-3-3 08:43
理解一下多态的 特点吧
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:
无论编译和运行,都参考做左边。




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