我正在尝试理解有关Java垃圾收集器和finalize()
方法的练习。
public class Five {
static int x = 1;
class String5 {
String s;
String5() {
this.s = ""+(++x);
}
public void finalize() {
System.out.print(s);
}
}
String5 a = new String5();
void f() {
String5 a = new String5();
}
public void finalize() {
System.out.print("H");
}
public static void main(String[] args) {
Five a5 = new Five();
a5.f();
a5 = new Five();
a5.f();
System.gc();
System.runFinalization();
}
}
练习要求我预测输出。正确答案是532H
。我预测输出应该是2H35
,我不明白为什么我的订单不正确。
答案 0 :(得分:4)
根据JLS,Java语言没有定义finalize
方法的执行顺序,因此实际的顺序是实现细节。
JLS 12.6. Finalization of Class Instances:
Java编程语言对finalize方法调用没有任何排序。终结器可以按任何顺序调用,甚至可以同时调用。
您遇到的顺序似乎建议堆栈实现 - 第4个和最后一个创建的String5
实例有资格进行垃圾回收首先完成(打印5
),然后是第2个和打印3
和2
的第1个(第3个不符合垃圾回收条件),最后完成第一个Five
实例并打印H
。
但是,不同的JDK实现可能会产生不同的顺序。