CodeGym /课程 /Java 语法 /使用 finalize 终结对象

使用 finalize 终结对象

Java 语法
第 6 级 , 课程 3
可用

“嗨。今天我们来简要了解一下 finalize() 方法。Java 虚拟机在销毁对象之前调用 finalize() 方法。该方法用于释放系统资源或执行其他清理任务。实际上,此方法与 Java 中的构造方法完全相反。你应该记得构造方法是用于创建对象的。”

“Object 类包含 finalize() 方法,这意味着所有其他类都是如此(因为所有 Java 类都是从 Object 类派生的)。你可以直接在类中实现自己的 finalize() 方法。”

“下面是一个示例:”

示例:
class Cat
{
    String name;

    Cat(String name)
    {
        this.name = name;
    }

    protected void finalize() throws Throwable
    {
        System.out.println(name + " 已销毁");
    }
}

“说的有道理,艾莉。”

“但是,你应该知道 Java 虚拟机决定是否调用此方法。通常,在方法内部创建并在方法完成时声明为垃圾的对象会立即销毁,而无需调用 finalize()。此方法更像是备份,而不是可靠的解决方法。最佳选择是在对象仍处于存活状态时释放所有系统资源(通过将对其他对象的引用设置为 null)。稍后,我将详细介绍此方法的优点和细微差别。到目前为止,你只需了解两件事:有这样一种方法,并且(惊喜!)这种方法并不总是被调用。”

评论 (2)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
且听风吟 级别 11,China
29 七月 2021
在根搜索算法中,要真正宣告一个对象死亡,至少要经历两次标记过程: 1.如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,那它会被第一次标记并且进行一次筛选。筛选的条件是此对象是否有必要执行 finalize()方法(可看作析构函数,类似于OC中的dealloc,Swift中的deinit)。当对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为没有必要执行。 2.如果该对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个名为F-Queue队列中,并在稍后由一条由虚拟机自动建立的、低优先级的Finalizer线程去执行finalize()方法。finalize()方法是对象逃脱死亡命运的最后一次机会(因为一个对象的finalize()方法最多只会被系统自动调用一次),稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果要在finalize()方法中成功拯救自己,只要在finalize()方法中让该对象重新引用链上的任何一个对象建立关联即可。而如果对象这时还没有关联到任何链上的引用,那它就会被回收掉。
kqhasaki 级别 23,Daxi,Taiwan, Province of China
4 八月 2021
很清楚的解释!希望大佬在后续的任务中能多多留言,给我们解释一些概念!