传递方法参数的Java Object的生命周期是什么?
例如我有一个对象Test
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结束或者是其他东西。
答案 0 :(得分:6)
它将保持至少直到start()
方法结束,因为它已在那里声明,这就是它的范围。除此之外,它的存在掌握在垃圾收集器手中。
编辑:
到start()
结束时,我的意思是,直到该方法结束它的执行。即使您进行了所显示的更改,Object
方法仍然需要start()
,因此它仍然只存在至少start()
方法的执行结束,除此之外,它取决于垃圾收集器。
答案 1 :(得分:2)
它的生命在调用new Test()
时开始,并且可能在start
方法完成后随时由垃圾收集器释放,因为在编译时可以证明它在以后永远不会被使用那一点。
如果start
方法(例如)设置一个静态字段来引用该对象,则垃圾收集器在该引用被释放之前无法收集它:
private static Test lastTested;
...
void start(Test test){
lastTested = test;
doSomething(test.testType());
}
答案 2 :(得分:2)
确切的生命周期由垃圾收集器确定:一旦没有对该对象的引用,它就可以被GC回收。在你的情况下,它将一直存在至少ClassB.start()
结束,因为如果该方法一旦完成就没有更多的引用