我读到 JVM gc 在找到一个无法访问的对象后运行该对象的 finalize() 方法。然后它检查对象是否仍然无法访问,如果不是,则将其删除。所以我写了一个finalize,使它的对象的引用再次可用:
public class Stuff {
List<Object> list;
public Stuff(List<Object> list) {
this.list = list;
}
@Override
protected void finalize() throws Throwable {
list.add(this);
System.out.println("A Stuff is finalized");
}
}
下面是主要方法:
public class Main {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add(new Stuff(list));
list.remove(0);
System.gc();
System.out.println(list.get(0));
}
}
运行 gc,因为“A stuff is finalized”出现在标准输出上,但 main 中的 printline 之后会引发 IndexOutOfBoundsException。我可以完成这项工作吗?
我通常根本不使用 finalize,我只是觉得看看 finalize 是否可以使其对象的引用再次可用会很有趣。我可以做这个工作吗?