首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在重写finalize()方法时首选调用super.finalize()?

为什么在重写finalize()方法时首选调用super.finalize()?
EN

Stack Overflow用户
提问于 2015-08-13 10:37:24
回答 3查看 4.3K关注 0票数 8

我得到了SonarQube错误:“强烈建议在此方法实现的末尾调用super.finalize(),以防父实现也必须释放某些系统资源。”

但是我发现Object类没有定案方法的实现。

代码语言:javascript
复制
protected void finalize() throws Throwable { }

那么为什么要调用super.finalize()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-13 10:45:21

这不是一种需要,而是一个应该遵循的终结者写作成语。

如果在将来的任何时候重构您的代码,并且您的类扩展了可能具有finalize方法的其他类,则此实践将防止出现奇怪的bug。

成语是

代码语言:javascript
复制
try {
   // Do whatever the finalization is
}
finally {
   super.finalize();
}

这确保了即使抛出一些异常(因为没有捕获终结器中的异常,它们的执行就会停止),也会调用超类终结器(如果曾经有一个非平凡的类终结器)。

当然:避免终结器。(约书亚·布洛赫的“有效Java”第二版第7项)。

票数 8
EN

Stack Overflow用户

发布于 2015-08-13 10:40:23

类对象的finalize方法不执行特殊操作;它只是正常返回。对象的子类可以重写此定义。

谁知道,您当前类的super类的ovveriden这个方法。

查看您在下面的层次结构中的位置。

代码语言:javascript
复制
Object  --- no implementation 

  -- 

    -- Your Super class -- Overriden the finalize 

      -- Current class

Super并不总是表示Object类。中间可能没有超级阶级。

票数 5
EN

Stack Overflow用户

发布于 2015-08-13 10:48:17

SonarQube错误也清楚地声明了。请考虑您编写的类在任何时候都可能具有父层次结构。清理资源总是在上面的层次结构上查找,以便进行有效的清理。因此,无论您是否有一个超类,使用super.finalize()对于清除来自父类的引用都很有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31985830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档