JAVA基础篇 之 finalize()方法的作用

我们知道java有垃圾回收器负责回收无用对象占据的内存资源,但也有特殊情况:假设你的对象(并非使用new)获得了一块特殊的内存区域,由于垃圾回收器只知道回收那些经由new分配的内存,所以它不知道如何释放该对象的这块特殊的内存。为了应对这种特殊情况,java允许在类中定义一个名为finalize()的方法。它的工作原理假定是这样的:一旦垃圾收集器准备释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,所以如果你打算用finalize(),就能在垃圾回收时刻做一些重要的清理动作。-----------《think in java》

​ 我先说下我理解的重要的几点:

  1. finalize()方法会在对象被回收前调用

  2. 不建议使用finalize()方法

  3. finalize()的唯一的,不常用的作用就是在对象被回收前做一些检测,去发现一些程序的缺陷:

    代码如下:

    public class Test {
        public static void main(String[] args) {
            Book b = new Book(true);
            b.checkIn();
            new Book(true);
            System.gc();
        }
    
        static class Book {
            boolean checkout = false;
    
            Book(boolean checkout) {
                this.checkout = checkout;
            }
    
            void checkIn() {
                checkout = false;
            }
    
            @Override
            protected void finalize() throws Throwable {
                if (checkout) {
                    System.out.println("该对象状态异常,应该先checkIn才能被收回");
                }
            }
        }
    
    }
    
    

    ​ 在上面的例子中,所有的Book对象在被当作垃圾回收前都应该被checkIn,但在main()方法中,由于我们的疏忽,导致有一本书未被checkIn。要是我们没在finalize()方法中验证的话,很难发现这种错误。

原文地址:https://www.cnblogs.com/daimzh/p/12854460.html