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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 位俊鹏 中级黑马   /  2014-2-27 01:23  /  1206 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

老师出的一个题,整的晕死了...关于面向对象的继承,和多态.
问:下列程序的运行结果是什么?
classA
{
   public void show()
    {
       show2();
    }
   
    public void show2()
    {
       System.out.println("我");
    }
}
classB extends A
{
    public void show2()
    {
       System.out.println("爱");
    }
}
classC extends B
{
    public void show()
    {
       super.show();
    }
   
    public void show2()
    {
       System.out.println("你");
    }
}
publicclass Test
{
    public static void main(String[] args)
    {
       A a = new B();
       a.show();
       B b = new C();
       b.show();
    }
}

评分

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

查看全部评分

5 个回复

倒序浏览
多态中对函数的调用,总结就是两句话:
编译看左边,
运行看右边。
第一个 a.show(),其实就相当于new B().show()
运行的是B中的show()方法(继承自A),show方法中调用show2(),由于B中重写了从A中继承来的show2(),所以运行的是B中的show2()。
第二个b.show()也是一样的道理,最终还是要运行C类中的方法,因为b.show()就相当于new C().show()。
运行的结果应该是“爱”“你”

评分

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

查看全部评分

回复 使用道具 举报
当在非静态成员函数中, 编译看左边,执行看右边。
在静态成员函数时,看左边
因为静态在类加载时已经存在啦,先于对象存在。

评分

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

查看全部评分

回复 使用道具 举报
这样来看
a中有show()和show2(),//a是new B()
其中show2()是B重写了A的show2();
a.show(),调用了show2(),这个show2()是B的show2(),
即是输出"爱"
同理,下面的那个应该是输出 “你”

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
一、多态,某一事物具有多种形态。在java中的一大体现:父类引用或者接口的引用指向了自己的子类对象。
二、随着多态的产生,子父类的成员也出现了变化,多态在子父类中的成员上的体现的特点:
     1、成员变量:在多态中,子父类成员变量同名。
         在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
         运行时期:也是参考引用型变量所属的类中是否有调用的成员。
     2、成员函数。
        编译时期:参考引用型变量所属的类中是否有调用的方法。
        运行时期:参考的是对象所属的类中是否有调用的方法。
     3、静态函数。
        编译时期:参考的是引用型变量所属的类中是否有调用的成员。
        运行时期:也是参考引用型变量所属的类中是否有调用的成员。
三、我觉得这个记住就好了,成员在编译和运行时期到底要怎样执行是sun公司说得算,不必太过深究为什么会这样。记住成员的体现特点会用来分析程序就好了。      


评分

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

查看全部评分

回复 使用道具 举报
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

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

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

A a = new B();
   a.show();  
编译时A类中有show()方法,编译成功;运行时B类中也有show()方法,执行B类中的show()方法。运行结果是“爱”。
B b = new C();
    b.show();
同理可得运行结果是“你”。


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