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

278*_*184 7 java sonarqube

我收到SonarQube错误:" 强烈建议在此方法实现结束时调用super.finalize(),以防父实现必须也处置一些系统资源. "

但我发现Object该类没有实现finalize方法.

protected void finalize() throws Throwable { }
Run Code Online (Sandbox Code Playgroud)

那为什么需要打电话super.finalize()

Rea*_*tic 6

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

如果在将来的任何时候,您重构代码并且您的类扩展了其他可能有finalize方法的类,这种做法可以防止出现奇怪的错误.

这个成语是

try {
   // Do whatever the finalization is
}
finally {
   super.finalize();
}
Run Code Online (Sandbox Code Playgroud)

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

当然:避免终结者.(Joshua Bloch的Effective Java第二版第7项).


Sur*_*tta 5

类Object的finalize方法不执行任何特殊操作; 它只是正常返回.Object的子类可以覆盖此定义.

谁知道,super你现在的班级ovveriden这个方法.

查看以下层次结构中的位置.

Object  --- no implementation 

  -- 

    -- Your Super class -- Overriden the finalize 

      -- Current class
Run Code Online (Sandbox Code Playgroud)

超级并不总是代表Object班级.中间可能没有超级课程.