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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 殷婷婷 中级黑马   /  2013-6-5 10:19  /  2472 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 殷婷婷 于 2013-6-5 13:23 编辑

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

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

7 个回复

倒序浏览
首先分析这个案例的执行过程。
当子类中没有声明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。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
婷婷加油哦
回复 使用道具 举报

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

懂了,谢啦,哈哈
回复 使用道具 举报

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

点评

就是就是  发表于 2013-6-5 14:34
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马