4

传递方法参数的 Java 对象的生命周期是什么?

例如我有一个对象测试

class Test{

    public string testType(){
       .....
    }
}

我有两个班级 A 和 B

class classA{

   classB b = new classB();

   void nextQuestion{
      b.start(new Test());
   }
}




class classB{
   void start(Test test){
      doSomething(test.testType());
   }
}

那么现在 Test 对象的寿命是多少?是只到 start 方法结束还是会一直存活到 classB 结束,或者它会一直存活到 classA 结束,或者是别的什么。

4

3 回答 3

6

它将至少保留到start()方法结束,因为它已在那里声明,这就是它的范围。除此之外,它的存在掌握在垃圾收集器的手中。


编辑:

最后start()我的意思是,直到该方法结束它的执行。即使您进行了显示的更改,Object该方法仍然需要start()它,因此它至少在start()方法执行结束之前仍然存在,除此之外它取决于垃圾收集器。

于 2012-06-22T13:50:54.740 回答
2

它的生命从new Test()被调用时开始,并且在方法完成后的任何时候都可能被垃圾收集器释放start,因为在编译时可以证明,在那之后它永远不会被使用。

如果该start方法(例如)设置一个静态字段来引用该对象,则垃圾收集器在该引用被释放之前无法收集它:

private static Test lastTested;
...

void start(Test test){
   lastTested = test;
   doSomething(test.testType());
}
于 2012-06-22T13:54:21.417 回答
2

确切的生命周期由垃圾收集器确定:一旦不再有对该对象的引用,它就可以被 GC 回收。在您的情况下,它至少会持续到结束,ClassB.start()因为一旦该方法完成,就没有更多的引用

于 2012-06-22T13:54:51.407 回答