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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-李勇 中级黑马   /  2012-7-7 16:40  /  2618 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第十一题:
class Fu
{
        int num=4;
        void show()
        {
        System.out.println("showFu");
        }
}
class Zi extends Fu
{
        int num=5;
        void show()
        {
        System.out.println("showZi");
        }
}
calss T
{
        public static void main(String[] args)
        {
                Fu f=new Zi();
                Zi z=new zi();
                System.out.println(f.num);
                System.out.println(z.num);
                f.show();
                z.show();
        }
}
程序输出结果4,5,showzi,showzi 为什么不是showFu,showzi?

6 个回复

倒序浏览
本帖最后由 邵阳 于 2012-7-7 17:02 编辑

因为被覆盖啦
class Fu
{
        int num=4;
        void show()
        {
        System.out.println("showFu");
        }
}
class Zi extends Fu
{
        int num=5;
        void show()
        {
        System.out.println("showZi");
        }
}
calss T
{
        public static void main(String[] args)
        {
                Fu f=new Zi();
                Zi z=new zi();
                System.out.println(f.num);
                System.out.println(z.num);
                f.show();
                z.show();
        }
}
程序输出结果4,5,showzi,showzi 为什么不是showFu,showzi?
这个属于多态。在父类里面有个void show()函数,在子类里面也有个void show()函数。
所以被覆盖啦。调用的还是子类的函数。
楼主可以记住多态的一些特点:
1:成员函数在多态调用时,变一看左边,运行看右边。
2:成员变量在多太中无论编译和运行,都参考左边。(引用型变量所属的类)
3:静态成员函数在对多态中,无论编译和运行,都参考左边。
你的属于第一种,实在不懂就硬背。


评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
这个问题你疑惑的应该是 f .num  为什么调的是父类的,而f.show() 为什么调用的是子类 吧……

对于 Fu f=new Zi();

来说 f 的编译时类型 是Fu 即父类, 运行时类型 为 Zi

当变量的编译时类型和运行时类型不同时,通过该变量访问它所引用的对象的实例变量时,该实例变量的值由声明该变量的类型决定,但通过该变量调用它引用的对象的实例方法时,该方法行为由它实际所引用的对象来决定。(以上摘抄)

对本程序 变量 f.i  i  的值由f的 编译时类型决定 也就是 Fu 所以 i 为4
              当 f.show() 时,调用的方法 由 f 的运行时类型决定 ,所以就调用了子类方法。

:P 刚好前一段闲逛时看到 我们黑马一个学员的笔记,要不还真不知道……
笔记地址:http://xianglachigen.iteye.com/blog/1563929  你可以看看
回复 使用道具 举报
变量不存在复写,只有方法才能复写。
回复 使用道具 举报
成员函数和静态是不能被重写的
你的show方法在调用时被重写了 所以打印出父类的成员函数和子类的方法
回复 使用道具 举报
丁二跃 发表于 2012-7-7 17:03
这个问题你疑惑的应该是 f .num  为什么调的是父类的,而f.show() 为什么调用的是子类 吧……

对于 Fu f ...

“f 的编译时类型 是Fu 即父类, 运行时类型 为 Zi”
笔记看完那叫个乱。
看来只能邵阳说的,背下来。
成员函数在多态调用时编译看左边,运行看右边

你们都用什么浏览器,我怎么发个贴子登录八回啊
回复 使用道具 举报
黑马-李勇 发表于 2012-7-7 17:44
“f 的编译时类型 是Fu 即父类, 运行时类型 为 Zi”
笔记看完那叫个乱。
看来只能邵阳说的,背下来。

呵呵……看完是有点乱,要多想想,我看了好久

我用的搜狗浏览器,保存书签后都是自动登录的……不过感觉搜狗是越来越不行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马