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

可以在Java中重载finalize()方法吗,java,overloading,finalize,Java,Overloading,Finalize,我在某个地方读到过,每个方法都可以重载 定稿 当然是一种方法。但是在搜索的同时,我也发现你不能重载这个方法 因此问题是我们可以重载finalize()方法吗?如果是,那么它是如何实现的?您可以重载finalize方法,这将成功编译: public class Test { public void finalize(String hi) { System.out.println("test"); } } 但是,它不会被垃圾收集器和JVM调用,因为它将调用一

我在某个地方读到过,每个方法都可以重载

定稿


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


因此问题是我们可以重载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");
    }

}

方法重载在同一子类中完成,而重写仅在子类中完成。由于其他对象类方法(equals()、hashCode()等)的重要性,我们会重写它们,但决不会重载这些方法中的任何一个

因此,虽然可以重载
finalize()
方法,但它就像子类中的一个新方法一样,不会被JVM视为(实际上是一个finalize()方法)。

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


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

我认为问题是关于
finalize()
,而不是
final
。如果它不接受任何参数,它怎么可能过载?还是你的意思是被推翻?为什么不试着这样做,看看会发生什么呢?@alfasin不过,作为记录,一个不接受任何参数的方法很容易被重载——只需在同一个类中编写一个同名的方法,它接受参数。首先,为什么要使用
finalize()
?“在搜索时,我还发现您无法重载此方法“方法重载可以在从基类继承的类中完成。例如,finalize方法是在对象类上保护和定义的,因此,如果我在任何java类中使用与基本finalize方法不同的签名定义任何其他名为finalize的方法,那么我确实重载了基本finalize方法