黑马程序员技术交流社区

标题: 多态问题 [打印本页]

作者: 秦碧    时间: 2012-2-14 17:46
标题: 多态问题
本帖最后由 秦碧 于 2012-2-15 16:30 编辑

class Fu
{
        int i=1;
        Fu()
        {
        i++;
        }
}

class Zi extends Fu
{
        int i=10;
        public Zi()
        {
        i=i+3;
        }
        public static void main(String[] args)
        {
                Fu a=new Zi();
                System.out.println(a.i);
                Zi b=new Zi();
                System.out.println(b.i);
        }
}
输出为2
13
b.i=13能理解
问题是:a.i为何等于2
作者: 陈丹阳    时间: 2012-2-14 17:56
a是父类引用指向子类对象,
对于同名成员函数来说,如果子类有重写,则调用子类函数
对于同名成员变量来说,则利用父类成员变量初始化。
这应该是JAVA的规定来的。
我想估计是因为一般情况下谁会在子类定义相同的一个变量,这里多态也没什么意思,利用父类的就行了,子类直接无视,以免混淆。
作者: 侯丽星    时间: 2012-2-14 19:41
本帖最后由 侯丽星 于 2012-2-14 19:42 编辑

Fu a=new Zi();//该语句中的“=”将该句分为左右。

多态中,成员调用规则如下:
成员变量在多态调用时,无论编译和运行,都参考左边(引用型变量所属的类。)
成员函数在多态调用时,编译看左边,运行看右边。
静态成员函数在多态调用时,无论编译和运行,都参考左边(引用型变量所属的类。)

作者: 朱辉    时间: 2012-2-14 19:44
我也是刚看过毕老师讲的多态这一节的视频,毕老师总结的方法是在多态中,成员变量无论编译还是运行,都参考左边引用型变量所属的类;再多补充一点,非静态成员函数在多态中调用时,编译看左边,运行看右边。静态成员函数无论编译还是运行都参考左边。我也是刚学这些,理解不是很深刻,请大家多多指教!
作者: 钟保罗    时间: 2012-2-14 20:33
因为Fu是Zi的父类,重写了构造函数,当new 子类的时候,也会执行以下父类的构造函数,所以i++就把i加1了i就等于2了。Fu a = new Zi(),引用变量类型是父类,所以a。i会打印出父类中的i成员变量等于2
作者: 彭坤    时间: 2012-2-14 21:14
貌似很简单啊,因为 在执行创建对象a之前Fu类中的i=1,创建对象时,调用了Fu类中的构造方法,而构造方法中要执行i++,所以,当a创建完成的时候,i的值已经发生了改变,等于2.所以执行b.i的时候打印2
作者: 孙汇川    时间: 2012-2-14 21:45
Fu a=new Zi();
不就是传说中的上转型嘛,把子类对象赋给父类引用,在调用输出对象的成员变量或静态函数时看=左边,调用非静态成员函数时看=右边。所以第一句调用的a.i是调用父类的成员变量。因为创建对象时调用构造函数i++变成了由1变成了2,所以会输出2.
Fu a=new Zi();在执行时创建了父类的对象a,没有给a分配对空间,new Zi();分配了对空间,a指向了该堆空间。调用函数时执行的是堆空间里的函数,调用变量和静态函数时是Fu类对象的成员。具体原因我记不清了。

作者: 黄锦成    时间: 2012-2-15 12:15
Fu a=new Zi();
System.out.println(a.i);
像这种情况,父类中有变量,子类也有变量,会选择父类的;还有如果在父类和子类中有相同的static函数,也是用父类的。只有非静态函数,才会调用子类的。

作者: Akm    时间: 2012-2-15 13:58
子类new子类,好理解。
父类new直接子类可不怎么好理解。
  Fu a =new Zi();它表示定义了一个Fu类的引用,指向新建的Zi类型的对象。由于Zi类是继承自它的父类Fu,所以Ful类型的引用是可以指向Zi类型的对象的。

  对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这称之为动态连接。
你这个子类没有重写父类的方法 当然调用了父类的方法 输出2了 。




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