Given:
   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  
    }}
When //doStuff  is reached,how many objects are eligible for GC?A,0
B,1
C,2
D,Compilation fails.
E,It is not possible to know.
F,An exception is thrown at runtime.答案选C,说是c1跟Short两个object符合要求,我不知道为什么,为什么c2不符合呢,不是在go 方法内附值为null了吗,而且又是引用传递,可以改变原来的值的,我想不明白,希望各位高手帮忙

解决方案 »

  1.   

    c1跟Short两个object符合要求?不明白什么意思,我觉得是c1和c3。
    go方法中的确传递的是c2的一个引用,但传入的是c2的地址(是一个数值,参数c2类似C中的指针),因此可以通过c2.variable = ...;改变原来的值。但是c2 = null是将go方法中的c2重新指向了null,但main方法中原来的c2指向的地址并没有改变。
    不知道这样说能不能明白?
      

  2.   

    “但是c2 = null是将go方法中的c2重新指向了null,但main方法中原来的c2指向的地址并没有改变。”
    把c2指向null,也就是把这个引用的对象的内容变为null,那main方法中的c2也是指向同一个对象,那个对象不也一样是null吗。“c1跟Short两个object符合要求?不明白什么意思,”
    意思是说,答案说程序运行完后c1跟short两个对象为null符合gc条件
      

  3.   

    麻烦,我分数比较少,抱歉,谢谢帮忙,不过您还是没有解决问题,跟答案有出入,c3一定不是,因为c3是通过c1调用go 方法,有返回值,所以,一定不符合垃圾回收要求。
      

  4.   

    public static void go(int a)
    {
      a = 2;
    }
    public static void go(String s)
    {
      s = null;
    }
    public static void main(String[] args)
    {
       int a = 3;
       String s = "123";
       go(a);
       go(s);
       System.out.println(s);
       System.out.println(a);
    }
    上面那个方法中参数a是值传递,它在方法中被赋值为2,但是原先main方法中的a却不会被改变。
    而String对象s传递的只是地址,地址是一个数值,不会在go方法被改变。c3的确不是,因为它根本没有指向过CardBoard对象
      

  5.   

    这里C3不是对象仅仅是一个引用,c2没有改变,所以也不会回收,C1为null,所以要回收,又因为c1里面有个Short类型对象,也要回收,所以两个!