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?
4 回答
SMILET
TA贡献1796条经验 获得超4个赞
子类中的int i = 4;
因为没有传入参数列表所以没有意义
然后子类中的构造函数,并没有super 所以默认super调用为空的构造函数
所以i=0+2+5 = 7
撒科打诨
TA贡献1934条经验 获得超2个赞
因为子类继承父类,这道题中应该有三个i变量,父类的i、子类的i、子类局部的i,局部的i就不管它了。 主函数中,创建了多态的引用d,d的实质是子类对象,那么在初始化过程中,应该是子类的i在发生变化呀,i=0+2+5=7,是不假,但是多态的引用调用成员变量,不应该是调用父类的吗?这里只是堆内存中子类对象的i在初始化呀。 我觉得调用的结果应该是5呀,因为父类构造函数初始化。但结果是7 始终想不明白。
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
是的呀,但关键是多态的情况下,利用父类引用去调用成员变量,此时调用的是父类下的成员变量呀,如果父类没有这个成员变量就报错啦。按照这个道理,那么上面的题目中父类的成员变量,变为了7.这是为什么啊?
添加回答
举报
0/150
提交
取消