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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严国泽 中级黑马   /  2014-7-13 22:29  /  1456 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Fu
{
        int NUM = 5;
}
class Zi extends Fu
{
        int NUM =9;
}
class DuoTaiDemo
{
        public static void main(String[] args)
        {
                Fu f = new Zi();
                System.out.println(f.NUM);
        }
}
这种情况下为什么输出结果是5而不是9呢?

11 个回复

倒序浏览
在多态中,当访问成员变量时,看左边,左边是哪个对象就掉那个对象的变量,掉方法时看右边,右边是哪个对象就调用哪个对象的变量
回复 使用道具 举报
1,成员变量:在多态中,子父类成员变量同名。
        在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
        运行时期:也是参考引用型变量所属的类中是否有调用的成员。
        简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
        再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。
2,成员函数。
        编译时期:参考引用型变量所属的类中是否有调用的方法。
        运行事情:参考的是对象所属的类中是否有调用的方法。
        为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
        简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
        更简单:成员函数 --- 编译看 = 左边,运行看 = 右边。
3,静态函数。
        编译时期:参考的是引用型变量所属的类中是否有调用的成员。
        运行时期:也是参考引用型变量所属的类中是否有调用的成员。
        为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
        调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
        简单说:静态函数 --- 编译运行都看 = 左边。
回复 使用道具 举报
Fu f = new Zi();    成员变量看的是 左边 引用型变量 f 所属的类中是否有调用的成员..
回复 使用道具 举报
多态中的成员特点:
                A:成员变量
                        编译看左边,运行看左边。
                B:成员方法
                        编译看左边,运行看右边。
回复 使用道具 举报
在堆内存中有两个区,一个是父的num,一个是子的num,f指向了父类的引用,打印就是父类的num了
回复 使用道具 举报
二楼说的很详细了。。。学习了。。
回复 使用道具 举报
同,不懂,学习。。。
回复 使用道具 举报
二楼正解
回复 使用道具 举报
成员变量不存在多态一说,多态只针对方法调用,成员变量只会被隐藏。你这里就是Fu的成员变量NUM被Zi的同名成员变量隐藏了。如果要访问被隐藏的父类变量,要么你在Zi类的定义中用super.NUM,要么在Zi类定义之外用父类引用访问
回复 使用道具 举报
懵懵懂懂,不过还是感谢大家
回复 使用道具 举报
我的理解是这样的
Fu f = new Zi();   就是把子类对象当成父类对象用
举个例子 把猫当作动物 仅此而已
所以当你拿到这个东西的时候就要遵守这个原则
只能看到动物的属性 不要再看猫的属性
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马