finalize()
方法是Object
类中定义的一个方法,用于在垃圾回收器回收对象前执行一些清理操作。当一个对象变成垃圾时,垃圾回收器会自动调用该对象的finalize()
方法,但是并不保证会一定被调用。
下面是finalize()
方法的使用攻略:
1. 方法定义
finalize()
方法的定义如下:
protected void finalize() throws Throwable {}
该方法是一个protected
的实例方法,返回值为空,抛出异常类型为Throwable
。
2. 执行顺序
当垃圾回收器决定回收一个对象时,会查看该对象是否覆盖了finalize()
方法。如果覆盖了,则会按如下顺序执行finalize()
方法:
- 首先,先执行
finalize()
方法中的所有代码。 - 然后,再调用
super.finalize()
执行Object
类中的finalize()
方法。
3. 注意事项
使用finalize()
方法的时候需要注意以下事项:
finalize()
方法通常用于回收资源或者执行一些清理操作,比如关闭数据库连接、释放系统资源等等。finalize()
方法只会被垃圾回收器调用一次,因此不要依赖于它来做一些重要的操作。比如,不要在finalize()
方法中释放非内存资源,因为可能会有其他地方还在使用该资源。- 不要在
finalize()
方法中抛出异常,因为它可能会影响垃圾回收器的正常运行。 finalize()
方法的执行时间不确定,因此不要在其中执行太复杂或耗时的操作。
下面是两个finalize()
方法的示例说明:
class Database {
private Connection conn;
public Database(String url, String user, String password) {
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// handle exception
}
}
protected void finalize() throws Throwable {
if (conn != null && !conn.isClosed()) {
conn.close();
}
super.finalize();
}
}
class Main {
public static void main(String[] args) {
Database db = new Database("jdbc:mysql://localhost:3306/mydb", "root", "password");
// do something with db
db = null; // make db eligible for garbage collection
System.gc(); // call garbage collector explicitly
}
}
上面的代码中,Database
类中覆盖了finalize()
方法,在这个方法中关闭了数据库连接。在Main
类中,我们使用了Database
对象并将其置为null
使其变成可回收对象,然后调用了System.gc()
方法请求垃圾回收器回收该对象。当垃圾回收器执行了finalize()
方法后,数据库连接就被正确关闭了。
class Resource {
private InputStream input;
public Resource(String path) throws IOException {
input = new FileInputStream(path);
}
protected void finalize() throws Throwable {
if (input != null) {
input.close();
}
super.finalize();
}
}
class Main {
public static void main(String[] args) throws IOException {
Resource res = new Resource("path/to/file");
// do something with res
res = null; // make res eligible for garbage collection
System.gc(); // call garbage collector explicitly
}
}
上面的代码中,Resource
类中覆盖了finalize()
方法,并在其中关闭了InputStream
对象。在Main
类中,我们使用了Resource
对象并将其置为null
使其变成可回收对象,然后调用了System.gc()
方法请求垃圾回收器回收该对象。当垃圾回收器执行了finalize()
方法后,资源的输入流就被正确关闭了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是finalize()方法? - Python技术站