淘先锋技术网

首页 1 2 3 4 5 6 7

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()方法会关闭文件并重新注册清理操作,以便再次使用该对象。