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

时间:2015-04-21 13:42:14

标签: java overloading finalize

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

  

的finalize()

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

您可以重载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),当你覆盖finalize()来调用它时,GC也会调用它。

答案 2 :(得分:1)

您可以毫无问题地重载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");
    }

}

答案 3 :(得分:1)

方法重载在同一&子类,而覆盖仅在子类中完成。由于它们的重要性,我们会覆盖其他Object类方法(equals(),hashCode()等),但绝不会重载任何这些方法。

因此,当你重载finalize()方法时,它就像你的子类中的一个新方法,并且不会被JVM考虑(真的是作为finalize()方法)。

答案 4 :(得分:0)

虽然像其他任何方法一样可以重载finalize(),但我没有看到这样做的重点。 JVM不会调用该方法,即使这不是你的目标,重载它也只会产生混淆。

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