我正在阅读有关finalize()方法的内容并且很好奇:
在finalize中清理对象(将它们设置为NULL)和从内存中删除对象的任务有什么区别?
答案 0 :(得分:10)
清理物品的任务有什么区别( 在finialize
中将它们设置为NULL)
设置为 null 会删除对该对象的 ONE 引用。 如果 NO 存在对对象的更多引用,则允许(不要求)垃圾收集器删除对象
从内存中删除对象?
在java中没有明确的方法来删除(销毁,删除)对象。 垃圾收集器会在他喜欢的时候做。 特别是从删除最后一个引用到删除/销毁对象的时间是不确定的
否需要在finalize方法中设置对 null 的引用。 当垃圾收集器调用 finalize 时,对象及其引用将很快消失。
在我很长时间的Java体验中,我从未编写过自己的finalize方法。
如果您的对象正在处理os资源,则会出现编写自己的finalize方法有意义的罕见情况。但是,通常您使用os访问的标准包
答案 1 :(得分:1)
当您将对象设置为null
时,您不会“清理”该对象,您只需将引用设置为null,请考虑:
Object a = new Object();
Object b = a;
a = null;
System.out.println(b);
一旦对象丢失所有引用,它将在下一次GC传递时收集。 Finalize是一种在发生这种情况时被调用的方法,你应该避免使用它。
只是不要保留额外的参考资料,让GC做它的工作。
答案 2 :(得分:0)
finalize()。你可以覆盖它,最好的做法是在try-catch-finally块中使用它来释放非java资源,比如文件。无论如何,如果你以这种方式使用它,你也应该调用super.finalize()来确保类层次结构的完成。
此方法始终用于高级用途,不应在正常的生产代码中使用。使用这些资源在方法的finally子句中释放资源。