class Fu{
boolean show(char a)
{
System.out.println(a);
System.out.println("Fu中的Show"); //测试Fu中的show方法
return true;
}
}
public 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'))
//for(int x=0;x<5;x++)
{
i++;
d.show('D');
}
}
boolean show(char a)
{
System.out.println(a);
System.out.println("Demo中的Show");//测试Demo中的show方法
return false;
}
}
这里要说明几点:
1、对于分析此类子父类继承,并有多态的程序的时候,我们可以添加一条打印语句进行区分,这样就可以清晰的分析程序运行的顺序。
输出结果:
A
Demo中的Show
B
Demo中的Show
这里可以看到,程序调用了两次show方法,而且都是Demo中的Show方法。这是因为子类覆盖了父类中的show方法
2、多态调用中,简单描述子父类中成员特点: 成员变量:对于成员变量在多态调用时,编译和运行都看等号左边。 成员函数:对于成员函数在多态调用时,编译看左边,运行看右边( 因为在子父类中,成员函数有覆盖的特性)。在本题中用到这条 静态函数:对于静态函数在多态调用时,编译和运行都看等号左边。
3、需要了解&&运算符的特点: 会产生短路情况,如果可以通过左边表达式得到最终结果,右边就不会在运算。例如:A&&B 如果A为true,则B运算;如果A为false,整个表达式的结果就为False,则B不运算。
综合上述分析,我们可以推出整个程序运行的顺序:
for(f.show('A');f.show('B')&&(i<2);f.show('C'))
(1)执行初始化条件:f.show('A') 子类覆盖父类的方法,则输出A,并打印 Demo中的Show,返回false
执行完后,变成:for(false;f.show('B')&&(i<2);f.show('C'))
(2)执行循环条件:f.show('B')&&(i<2); 因为是&&,先看左边f.show('B'),子类覆盖父类的方法,则输出B,并打印 Demo中的Show,返回false ;此时整个表达式为false,不运行右边
的(i<2)。整个循环结束
|