黑马程序员技术交流社区

标题: 成员变量的多态调用问题 [打印本页]

作者: 殷婷婷    时间: 2013-6-5 10:19
标题: 成员变量的多态调用问题
本帖最后由 殷婷婷 于 2013-6-5 13:23 编辑

大家好,众所周知,在多态中成员变量无论编译和运行,都参考引用型变量所属的类。在左图代码中,D.i 照此方法在Super类中运行出来不应该是2吗?。
为什么运行出来是5呢?而且我在下图又稍加了修改,在Demo中定义了 i  ,运行结果这才是2。这是为什么啊?


作者: 张金铎    时间: 2013-6-5 11:30
首先分析这个案例的执行过程。
当子类中没有声明i变量时,D=new Demo("A")。此时自动调用父类无参构造,所以控制台打印“B”,此时i等于2,接下来执行子类构造函数,然后控制台打印“C”,然后i赋值5.所以这时父类的i等于5.接下来System.out.println(D.i);当然就是5啦。
当子类中声明了i变量时,D=new Demo("A")。此时自动调用父类无参构造,所以控制台打印“B”,此时是父类 i 等于2,接下来执行子类构造函数,然后控制台打印“C”,给i赋值5,此时是子类内部有自己的i,所以是子类i 等于5。接下来main函数里面System.out.println(D.i);因为使用了多态,当父类应用指向子类对象时,如果调用成员变量时,编译看父类,执行看父类。也就是说此时打印出来的是父类的i,而不是子类的i。所以是2,不是5。
作者: 袁梦希    时间: 2013-6-5 11:38
婷婷加油哦
作者: 殷婷婷    时间: 2013-6-5 11:51
袁梦希 发表于 2013-6-5 11:38
婷婷加油哦

嗯,正在努力中,不知能不能赶上云四呢。谢谢哦:handshake
作者: luckwei    时间: 2013-6-5 12:14
在多态中成员变量无论编译和运行,都参考引用型变量所属的类当你Super  D = new Demo("A");时它走Demo的构造函数 public Demo(String a) 但是他又有一次的隐式的调用了父类Super()的空参数构造函数,空参数的变量就是i 就是(0+2)了。主函数中System.out.println(D.i);就会调用父类(D)中的变量 i .
作者: 殷婷婷    时间: 2013-6-5 13:22
张金铎 发表于 2013-6-5 11:30
首先分析这个案例的执行过程。
当子类中没有声明i变量时,D=new Demo("A")。此时自动调用父类无参构造,所 ...

懂了,谢啦,哈哈
作者: 张金铎    时间: 2013-6-5 14:32
袁梦希 发表于 2013-6-5 11:38
婷婷加油哦

切,女生就有特殊照顾,咋没见哪个斑竹当初给俺们老爷们加油!可耻的斑竹!{:3_52:},嘻嘻!别怀恨在心以后不给我技术分哦。




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