【问题标题】:Can finalize() method be overloaded in JavaJava中可以重载finalize()方法吗
【发布时间】:2015-06-28 17:11:52
【问题描述】:

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

finalize()

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

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

【问题讨论】:

  • 我认为问题是关于finalize(),而不是final
  • 如果它不接受任何参数,它如何被重载?还是您的意思是覆盖?你为什么不简单地尝试一下,看看会发生什么?
  • @alfasin 不过,作为记录,不接受任何参数的方法很容易被重载——只需在同一个类中编写一个同名的方法, 就可以了 接受参数。
  • 第一件事:为什么要使用finalize()
  • "搜索的时候我也发现不能重载这个方法"

标签: java overloading finalize


【解决方案1】:

你可以重载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】:

    方法重载在同一个子类中完成,而Overriding只在子类中完成。由于它们的重要性,我们确实覆盖了其他 Object 类方法(equals()、hashCode() 等),但从不重载这些方法中的任何一个。

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

    【讨论】:

    • 方法重载可以在从基类继承的类中完成。例如 finalize 方法是在 Object 类上受保护和定义的,因此,如果我定义任何其他名为 finalize 的方法,其签名与任何 java 类中的基本 finalize 方法不同,我确实重载了基本 finalize 方法
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您可以重载 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");
          }
      
      }
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-07-07
          • 2016-06-10
          • 1970-01-01
          • 1970-01-01
          • 2016-10-14
          • 2019-04-10
          • 2010-12-04
          • 2018-12-03
          • 2011-01-29
          相关资源
          最近更新 更多