可以在 Java 中重载 finalize() 方法吗

Can finalize() method be overloaded in Java

我在某处读到过每个方法都可以重载。

finalize()

当然是一种方法。但是在搜索时我也发现你不能重载这个方法。

所以问题是我们可以重载finalize()方法吗?如果那么它是如何实现的?

您可以重载 finalize 方法,这将成功编译:

public class Test
{
    public void finalize(String hi)
    {
        System.out.println("test");
    }
}

但是它不会被垃圾收集器和 JVM 调用,因为它将调用没有参数的那个。

GC 和 JVM 只会并且总是调用带有签名

finalize
protected void finalize() throws Throwable

解决方法

您可以简单地覆盖 finalize 并使其调用带有参数的方法 :

public class Test
{
    public static void main(String args[])
    {
        new Test();
        System.gc();
    }

    @Override
    public void finalize() throws Throwable
    {
        super.finalize();
        this.finalize("allo");
    }

    public void finalize(String hi)
    {
        System.out.println(hi);
    }
}

那将打印 allo。这样你就可以在你想要的地方调用 finalize(String hi),GC 也会调用它,因为你覆盖了 finalize() 来调用它。

是的,你可以。但是JVM不会调用重载版本。

@Override
protected void finalize() throws Throwable
{
  super.finalize();
}

protected void finalize(String lol) throws Throwable
{
  finalize();
}  

您可以毫无问题地重载 finalize 方法。这是另一个例子:

public class FinalizeOverloader {

    protected void finalize(String userId) {
        System.out.println("I could overload finalize...");
    }

    public static void main(String[] args) {
        FinalizeOverloader fO = new FinalizeOverloader();
        fO.finalize("AbC");
    }

}

方法重载在相同的&childclass中完成,而覆盖在[=中完成19=] class 而已。由于它们的重要性,我们确实覆盖了其他 Object class 方法(equals()、hashCode() 等),但从不重载任何这些方法。

因此,虽然您可以重载 finalize() 方法,但它就像 child class 中的新方法一样,不会被 JVM 考虑(作为确实是 finalize() 方法)。

虽然可以像任何其他方法一样重载 finalize(),但我不认为这样做有什么意义。 JVM 不会调用该方法,即使这不是您的目标,重载它也只会产生混乱。

另一方面,如果您的意思是覆盖,它可能更有意义,但强烈不推荐这种方法。使用终结器有很多缺点。有关详细信息,您可以在 Joshua Bloch 的 "Effective Java" 书中找到一些好的建议(第 7 项)。它基本上说,避免使用终结器。