【问题标题】:Will finalize method run without overriding it?finalize 方法会在不覆盖它的情况下运行吗?
【发布时间】:2014-06-10 19:40:45
【问题描述】:

现在我知道这是一个愚蠢的问题,但是,finalize 方法在对象类中被定义为受保护的,并且它将在我们的类中被私有继承。

而且我们知道 finalize 方法在对象被销毁之前运行,所以我的问题是,如果我们不覆盖它?它还会以私有形式运行吗??

【问题讨论】:

  • 你为什么不试试呢?
  • @AngeloNeuschitzer 我该怎么做??
  • 你写了一个继承 finalize 为私有的类,看看会发生什么。或者,如果您想知道 Object 中的 finalize 方法何时被调用,您可以启动一个调试器并在其上放置一个观察器。
  • Why do finalizers have a “severe performance penalty”?;不会运行琐碎的终结器(即,不会被 Object 覆盖)。

标签: java finalize


【解决方案1】:

finalize 方法在对象类中被定义为受保护的,它 将在我们的类中被私有继承。

不,它不会作为私有继承到子类中。

finalize 方法会在不覆盖的情况下运行吗?

是的,它会运行,因为它是继承的。

【讨论】:

  • 它作为私有继承,因为我们知道类的受保护成员在不同的包子类中私有继承
  • @user3380123 不,不是。阅读访问修饰符以及如何更改它们。简而言之:您可以使它们更宽(受保护 -> 公开),但永远不会变窄(受保护 -> 私有)
【解决方案2】:

您不能将 finalize 覆盖为私有。

如果你尝试你会得到这个错误:

Cannot reduce the visibility of the inherited method from Object.

我认为您应该尝试更多地了解访问修饰符。 protected 永远不会(也不能)变成private

这行得通:

protected void finalize() throws Throwable {
    // something
}

这也有效:

public void finalize() throws Throwable {
    // something
}

这行不通:

private void finalize() throws Throwable {
    // something
}

阅读此答案:In Java, what's the difference between public, default, protected, and private?

【讨论】:

    【解决方案3】:

    是的,finalize() 方法仍然会运行,即使您不使用自己的实现来覆盖它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多