我是Java课程的学生,今天学到了一些关于Java的东西,这使我的齿轮转向了。当我问老师如何以及为什么时,他不确定这种行为。任何人都可以解释为什么以下示例有效吗?
class Example {
public int ex_val;
public Example (int a) {
this.ex_val = a;
}
public int getExVal () {
return this.ex_val;
}
}
如果我要在另一个类的方法中创建一个“Example”实例并“返回”该对象,它可以成功跳出其原始范围并随后使用。
class ParentObject {
// Instance Variables
public Example a;
public ParentObject (int number) {
// Initialize instance variable object from out-of-scope instantiation
this.a = genExample(number);
// Verify scope creep
System.out.println(this.a.getExVal());
}
public Example genExample (int a) {
return new Example(a);
}
}
这可行,但这种行为是否稳定?我可以指望这个吗?垃圾收集器可以在一个方法的return语句和调用函数的赋值语句之间跳转吗?我是否根据操作系统的JVM版本运行失败风险?如果可以依赖它,这似乎是方便的功能。
答案 0 :(得分:10)
在Java中这是一个完全正常,常见且可靠的事情,要做的就是相信垃圾收集器会在没有任何实时引用的情况下立即清理对象。这不依赖于操作系统或依赖于JVM:任何JVM都可以使用它。
答案 1 :(得分:3)
这是完全正常的。
垃圾收集器无法收集它,因为它仍由您的a
字段引用。
与C ++不同,Java对象永远不会链接到创建它们的范围。