黑马程序员技术交流社区

标题: 关于多态下成员变量的特点,还是没懂 [打印本页]

作者: 严国泽    时间: 2014-7-13 22:29
标题: 关于多态下成员变量的特点,还是没懂
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呢?
作者: 张盼    时间: 2014-7-13 22:44
在多态中,当访问成员变量时,看左边,左边是哪个对象就掉那个对象的变量,掉方法时看右边,右边是哪个对象就调用哪个对象的变量
作者: 青偆丶易逝〃    时间: 2014-7-13 22:47
1,成员变量:在多态中,子父类成员变量同名。
        在编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
        运行时期:也是参考引用型变量所属的类中是否有调用的成员。
        简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。
        再说的更容易记忆一些:成员变量 --- 编译运行都看 = 左边。
2,成员函数。
        编译时期:参考引用型变量所属的类中是否有调用的方法。
        运行事情:参考的是对象所属的类中是否有调用的方法。
        为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖。
        简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。
        更简单:成员函数 --- 编译看 = 左边,运行看 = 右边。
3,静态函数。
        编译时期:参考的是引用型变量所属的类中是否有调用的成员。
        运行时期:也是参考引用型变量所属的类中是否有调用的成员。
        为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
        调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
        简单说:静态函数 --- 编译运行都看 = 左边。
作者: 青偆丶易逝〃    时间: 2014-7-13 22:50
Fu f = new Zi();    成员变量看的是 左边 引用型变量 f 所属的类中是否有调用的成员..
作者: hxwo211314    时间: 2014-7-13 23:25
多态中的成员特点:
                A:成员变量
                        编译看左边,运行看左边。
                B:成员方法
                        编译看左边,运行看右边。
作者: Adjin    时间: 2014-7-14 01:02
在堆内存中有两个区,一个是父的num,一个是子的num,f指向了父类的引用,打印就是父类的num了
作者: blue_sky    时间: 2014-7-14 11:12
二楼说的很详细了。。。学习了。。
作者: IT初学者    时间: 2014-7-14 11:48
同,不懂,学习。。。
作者: 嗅ㄨiaǒ孑    时间: 2014-7-14 11:53
二楼正解
作者: fantacyleo    时间: 2014-7-14 12:02
成员变量不存在多态一说,多态只针对方法调用,成员变量只会被隐藏。你这里就是Fu的成员变量NUM被Zi的同名成员变量隐藏了。如果要访问被隐藏的父类变量,要么你在Zi类的定义中用super.NUM,要么在Zi类定义之外用父类引用访问
作者: 严国泽    时间: 2014-7-14 15:25
懵懵懂懂,不过还是感谢大家
作者: 郑飞    时间: 2014-7-14 17:23
我的理解是这样的
Fu f = new Zi();   就是把子类对象当成父类对象用
举个例子 把猫当作动物 仅此而已
所以当你拿到这个东西的时候就要遵守这个原则
只能看到动物的属性 不要再看猫的属性




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