一个关于java的题目,望高手指导一下

Posted on 2008-09-23 00:41 yxc 阅读(345) 评论(3)  编辑  收藏 所属分类: Java基础知识
Given:
When //do Stuff  is reached,how many objects are eligible for GC.
class CardBoard{
     Short story 
= 5;
     CardBoard go(CardBoard cb)
{
            cb 
= null;
            
return cb;
          }


public static void main(String[] args){
    CardBoard c1 
= new CardBoard();
    CardBoard c2 
= new CardBoard();
    CardBoard c3 
= c1.go(c2);
    c1
=null;
    
//do Stuff
   }

}

高手帮解释一下,谢谢了.

Feedback

# re: 一个关于java的题目,望高手指导一下  回复  更多评论   

2008-09-23 08:10 by sofot
c1、c3、cb被回收吧,这几个在堆中而且值为null;
story是简单类型,在栈中,离开作用域自动消失,不需要回收;

# re: 一个关于java的题目,望高手指导一下  回复  更多评论   

2008-09-26 10:36 by
两个吧,一个是c2,一个是c2里面的story
不同意楼上的说法,注意到story 声明的是Short,不是short,Short是一个类,所以story 是一个对象,最简单的验证就是在main方法中c2.story后打点.是能点儿出方法的。

理由
c1肯定是被销毁了
然后就是CardBoard c3 = c1.go(c2);
看go方法无论什么时候都是返回null,c3肯定是null了
c2为什么不是null,是考的值传递和引用传递的知识
c2存放的是指向new CardBoard()的一个地址
而c1.go(c2);传给go方法的是c2的一个拷贝
既然c2是一个地址,那么传给go方法的就是这个地址的一个拷贝,也就是一个副本
虽然副本被传递到go方法后被指向了null,但main方法中的c2还老老实实指向那个new CardBoard();

呵呵 ,有些啰嗦

# re: 一个关于java的题目,望高手指导一下  回复  更多评论   

2008-09-28 14:39 by yxc
@猪
谢谢,很有道理!我也是类似的想法.c2只是被拷贝了一个副本进去,真正的c2并没有被改变,是吧.

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 5, comments - 10, trackbacks - 0, articles - 0

Copyright © yxc