【问题标题】:Life of a Java ObjectJava 对象的生命周期
【发布时间】:2012-06-22 13:49:44
【问题描述】:

传递方法参数的 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 结束,或者是别的什么。

【问题讨论】:

  • 它会一直存活到至少 start() 方法完成执行,因为内存由垃圾收集器而不是程序员管理,所以在 Java 中没有关于对象生命周期的no保证.

标签: java object object-lifetime


【解决方案1】:

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


编辑:

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

【讨论】:

  • 至少直到start()结束。
  • 是的。愚蠢的错误。已更正。
【解决方案2】:

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

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

private static Test lastTested;
...

void start(Test test){
   lastTested = test;
   doSomething(test.testType());
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 2013-08-22
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多