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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘朋朋 黑马帝   /  2011-10-8 08:14  /  2194 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. public class Test1 {
  2. public int a ;
  3. public Test1(){
  4. a=3;
  5. }
  6. public void addFive(){
  7. a+=5;
  8. }
  9. public static void main(String[] args) {
  10. Test1 t = new Test2();
  11. t.addFive();
  12. System.out.println(t.a);
  13. }
  14. }
  15. class Test2 extends Test1{
  16. public int a;
  17. public Test2(){
  18. a=8;
  19. }
  20. public void addFive(){
  21. a+=5;
  22. }
  23. }
复制代码
为什么结果是3呢?这个对象的堆空间是怎么搞的?

该贴已经同步到 刘朋朋的微博

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 成杰 于 2011-10-8 08:38 编辑

Test1 t = new Test2();
父类的引用指向子类对象(对象转型),会失去原有对象的一些属性,即转型对象只能访问父类中的属性和方法(在这个题中,t 只能访问test1中的属性和方法)。

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
子类的内存空间是在父类内存空间上扩展的 |-----------| | 父类内存 | | 父类的a | |-----------| | 子类内存 | | 子类的a | |-----------| | VT | |-----------| VT是方法管理的虚拟表(viture table) 可以想象成这样一个内存模型,子类对象是个大整体,父类对象是子类对象的一部分 this包含整个大整体的空间,super包含父类对象的内存空间当你用父类引用变量指向子类对象的时候,引用有效部分只是父类内存空间和VT,即子类扩展的新的属性和方法,父类引用变量是访问不到的 LZ可以试试在Test2追加一个新的方法,如addSix(); 然后调用 t.addSix()看看,就知道t能访问的范围了如果此时想访问 addSix(),必须转换为子类对象才可以,即 ((Test2)t).addSix() (Test2)t实际上就是相当于一个临时变量 Test2 t2 = (Test2)t; LZ再好好体会一下这其中的意思吧

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 赞一个!

查看全部评分

回复 使用道具 举报
只有成员方法是动态绑定的,其他的类成员变量,静态变量及静态方法都是静态绑定的,所以你尽管创造的是子类的实例,但声明却是父类的,所以成员变量是跟父类绑定在一起的,也就是a=3了,之后你调用了addFive()方法,这个是动态绑定的,绑定到子类中的addFive()方法,在这个方法中,你把子类的a加了5,父类的a并没有+5,所以最后打印出a=3了。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 赞一个!

查看全部评分

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