有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

此Java代码中有多少对象符合垃圾收集条件?

根据我正在读的书,这里的答案显然是2,但我仍然不明白为什么。它说在“//do stuff”行之后,2个对象将符合GC的条件

有人能一步一步地给我解释一下吗?在代码中的某一行之后,知道有多少对象符合垃圾收集的条件,这像是一个技巧吗?因为我们被告知这些类型的问题(有多少是gc可省略的)将出现在测试中

class CardBoard {  
   Short story = 200;  
   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 
   } 
}

是的,答案是“2个对象在“//do stuff”行之后可以进行垃圾收集,但我仍然不明白为什么


在这张图片中,它也说明了为什么答案是2,但是解释让我更加困惑

Image from the SCJP book we're told to read.

它甚至不能解释其他物体发生了什么


编辑:

所以根据你们的说法,C1和C3符合GC的条件,我可以理解为什么,因为C1被设置为null和C1。GO(C2)将null返回到C3

但是根据这本书,只有C1是合格的,答案是2,因为包装很短。我不知道这是为什么,甚至不知道什么是短包装器对象


共 (3) 个答案

  1. # 1 楼答案

    我认为正确的答案实际上是只有一个对象符合“//do stuff”行之后的垃圾收集条件

    在该代码中,只创建了两个对象,然后c1和c2引用它们。在“c1=null;”行之后一个对象立即成为GC的合格对象,尽管第二个对象仍然可以通过c2 ref访问

    更新:

    我遗漏了一个细节——每个调用new CardBoard()都会创建两个对象,因此调用c1 = null会为GC创建一个合格的CardBoard和他的嵌套短成员

  2. # 2 楼答案

    c2仍在引用硬纸板对象。c1被设置为null,当我们调用c1时,c3引用null。开始(c2)。 因此,它们(c1和c3)都不再在内存中引用,并且符合垃圾收集的条件

  3. # 3 楼答案

    我已经运行并调试了代码,我可以看到c1和c3是空的(出于明显的原因),而c2就是空的!=空

    这是因为Java中的对象是通过值(explanation)传递的,在方法中设置c2=null不会导致原始c2设置为null