Java 中使用new
创建一个对象的方法是广为人知的,但是您是否知道在 Java 中和new
相反的操作是什么呢?这个操作是用于销毁对象的,它被称为finalize()
。
每个 Java 对象都有一个finalize()
方法,该方法可以在对象被垃圾回收之前被调用。它可以用来执行一些清理操作,例如关闭文件或释放其他资源。
下面是一个示例:
class MyClass { File file; public MyClass(String filename) { file = new File(filename); } protected void finalize() { try { file.close(); } catch (IOException e) { // handle exception } } } MyClass obj = new MyClass("example.txt"); // 在这里可执行一些操作,然后让 obj 对象成为垃圾 obj = null; // 这会将 obj 对象设置为 null,使其可以被垃圾收集
在这个例子中,MyClass
包含一个文件对象file
,它的finalize()
方法用于关闭文件。当MyClass
对象变为垃圾时,它的finalize()
方法会自动调用。
需要注意的是,finalize()
方法是由垃圾收集器线程异步调用的,因此不应该在其中执行任何耗时的操作。
在 Java 9 中,finalize()
已被弃用。取而代之的是使用Cleaner
类来提供类似的功能。例如:
class MyClass implements AutoCloseable { private Cleaner cleaner = Cleaner.create(); private File file; public MyClass(String filename) { file = new File(filename); cleaner.register(this, file::close); } public void close() throws IOException { file.close(); } } MyClass obj = new MyClass("example.txt"); // 在这里可执行一些操作,然后关闭 obj obj.close(); // 这会调用 close() 方法,关闭文件并重新注册 cleaner
在这个例子中,MyClass
实现了AutoCloseable
接口,并用Cleaner
类注册了一个清理操作。当MyClass
对象被关闭时,调用close()
方法会关闭文件并重新注册清理操作,以便再次使用该对象。