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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦碧 黑马帝   /  2012-2-14 17:46  /  1983 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

貌似很简单啊,因为 在执行创建对象a之前Fu类中的i=1,创建对象时,调用了Fu类中的构造方法,而构造方法中要执行i++,所以,当a创建完成的时候,i的值已经发生了改变,等于2.所以执行b.i的时候打印2

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 秦碧 于 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

评分

参与人数 1技术分 +1 收起 理由
admin + 1 加油,马上就25分了!

查看全部评分

8 个回复

倒序浏览
a是父类引用指向子类对象,
对于同名成员函数来说,如果子类有重写,则调用子类函数
对于同名成员变量来说,则利用父类成员变量初始化。
这应该是JAVA的规定来的。
我想估计是因为一般情况下谁会在子类定义相同的一个变量,这里多态也没什么意思,利用父类的就行了,子类直接无视,以免混淆。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 侯丽星 于 2012-2-14 19:42 编辑

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

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

评分

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

查看全部评分

回复 使用道具 举报
我也是刚看过毕老师讲的多态这一节的视频,毕老师总结的方法是在多态中,成员变量无论编译还是运行,都参考左边引用型变量所属的类;再多补充一点,非静态成员函数在多态中调用时,编译看左边,运行看右边。静态成员函数无论编译还是运行都参考左边。我也是刚学这些,理解不是很深刻,请大家多多指教!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 加分鼓励!

查看全部评分

回复 使用道具 举报
因为Fu是Zi的父类,重写了构造函数,当new 子类的时候,也会执行以下父类的构造函数,所以i++就把i加1了i就等于2了。Fu a = new Zi(),引用变量类型是父类,所以a。i会打印出父类中的i成员变量等于2
回复 使用道具 举报
孙汇川 黑马帝 2012-2-14 21:45:50
7#
Fu a=new Zi();
不就是传说中的上转型嘛,把子类对象赋给父类引用,在调用输出对象的成员变量或静态函数时看=左边,调用非静态成员函数时看=右边。所以第一句调用的a.i是调用父类的成员变量。因为创建对象时调用构造函数i++变成了由1变成了2,所以会输出2.
Fu a=new Zi();在执行时创建了父类的对象a,没有给a分配对空间,new Zi();分配了对空间,a指向了该堆空间。调用函数时执行的是堆空间里的函数,调用变量和静态函数时是Fu类对象的成员。具体原因我记不清了。

评分

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

查看全部评分

回复 使用道具 举报
Fu a=new Zi();
System.out.println(a.i);
像这种情况,父类中有变量,子类也有变量,会选择父类的;还有如果在父类和子类中有相同的static函数,也是用父类的。只有非静态函数,才会调用子类的。

评分

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

查看全部评分

回复 使用道具 举报
Akm 黑马帝 2012-2-15 13:58:03
9#
子类new子类,好理解。
父类new直接子类可不怎么好理解。
  Fu a =new Zi();它表示定义了一个Fu类的引用,指向新建的Zi类型的对象。由于Zi类是继承自它的父类Fu,所以Ful类型的引用是可以指向Zi类型的对象的。

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

评分

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

查看全部评分

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