为了账号安全,请及时绑定邮箱和手机立即绑定

多态中,成员变量的特点

多态中,成员变量的特点

qq_HkJxGnMdGm_0 2019-07-20 18:33:07
class Super{    int i=0;     public Super(String s)     {         i=1;     }     public Super()     {         i+=2;     }}class Demo extends Super {     public Demo(String s)     {         i+=5;     }     public static void main(String[] args)      {         int i=4;         Super d=new Demo("YES");         System.out.println(d.i);     }}打印的结果是7,就是i等于7。但是,我记得一个多态的引用,父类引用指向子类对象用来调用成员变量,那么调用的应该是父类下的 i 呀,为什么这里输出结果是7呢?那么这里调用的是父类的 i 吗?父类的 i 变为了7?
查看完整描述

1 回答

?
慕粉1469888185

TA贡献1条经验 获得超0个赞

子类中的int i = 4;

因为没有传入参数列表所以没有意义

然后子类中的构造函数,并没有super 所以默认super调用为空的构造函数

所以i=0+2+5 = 7

查看完整回答
反对 回复 2019-07-23
  • qq_HkJxGnMdGm_0
    qq_HkJxGnMdGm_0
    因为子类继承父类,这道题中应该有三个i变量,父类的i、子类的i、子类局部的i,局部的i就不管它了。 主函数中,创建了多态的引用d,d的实质是子类对象,那么在初始化过程中,应该是子类的i在发生变化呀,i=0+2+5=7,是不假,但是多态的引用调用成员变量,不应该是调用父类的吗?这里只是堆内存中子类对象的i在初始化呀。 我觉得调用的结果应该是5呀,因为父类构造函数初始化。但结果是7 始终想不明白。
  • 慕粉1469888185
    慕粉1469888185
    父类运行在子类前,所以先算父类,然后才是子类,这是继承的顺序问题
  • qq_HkJxGnMdGm_0
    qq_HkJxGnMdGm_0
    是的呀,但关键是多态的情况下,利用父类引用去调用成员变量,此时调用的是父类下的成员变量呀,如果父类没有这个成员变量就报错啦。按照这个道理,那么上面的题目中父类的成员变量,变为了7.这是为什么啊?
  • 1 回答
  • 0 关注
  • 436 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信