我读(某处)finalize()
不保证当子类被垃圾收集时调用父类,这是否意味着大多数开发人员覆盖子类中的finalize()
并调用super.finalize()
?你是否在子类中调用super.finalize()?
7
A
回答
13
Finalize不会自动调用超类。所以,如果你重写敲定,以确保超类的正确方法得到清理将
protected void finalize() {
try {
// do subclass cleanup
}
finally {
super.finalize();
}
}
看到这个参考文章http://www.ibm.com/developerworks/java/library/j-jtp06294/index.html
应该值得注意的是,终结不是很容易预测而你不知道对他们是否运行有任何控制。在最终确定方法中不应该做任何关键的事情。一般来说,最好只是对班级进行明确的清理。
3
最好避免依靠finalize清理任何非Java资源(不保证完成调用)。如有可能,请尝试使用资源(如果使用JDK7)或尝试最终子句以尽可能地清理其他选项中的资源。如果您要使用finalize,您可以将super.finalize放入try finally块中。不依靠敲定来清理资源是明智的。
// don't make it public!
protected void finalize() throws Throwable
{
try
{
// custom finalization here
}
finally
{
super.finalize();
}
}
如果这个想法是清理资源,这将是明智的,也许看看虚引用 - 对象是虚可如果它既不强/弱/软可及,已经敲定&有在至少一个幻影参考(即对象已完成但尚未回收)。
相关问题
- 1. 你可以调用AudioObjectSetPropertyData是否同步?
- 2. 你是否在电子邮件中使用换行符?
- 3. 是否可以在超类实现中调用子类虚函数?
- 4. 在子类中调用基类的模板函数是否合法?
- 5. 你的javadocs是否被编译到你的类文件中?
- 6. 在类或子类中调用发布?
- 7. 如何在子类中调用父类?
- 8. 父类是否应引用子类?
- 9. 从Java子类中调用的方法不是在父类
- 10. 你是否将你的助手类存储在单独的程序集中?
- 11. 当子类化threading.Thread时,是否必须调用super.join()?
- 12. 你如何调用在你的java类中的UI中输入的值?
- 13. GameObject.GetComponent()是否查找子类?
- 14. cancelOperation在NSView子类中不调用
- 15. 子类NSControl,IBAction不在Swift中调用
- 16. 在子类中限制函数调用
- 17. 调用子类的方法,在Java中
- 18. 在UICollectionViewLayout子类中未调用layoutAttributesClass
- 19. shouldStartLoadwithRequest未在子类中调用
- 20. Metaclass不在子类中调用
- 21. 在UIView子类中调用drawRect
- 22. mouseDragged:在NSView子类中未调用
- 23. 你是否总是在Hibernate中使用二级缓存?
- 24. 检查是否包含在子类
- 25. self.class.delete是否调用类方法?
- 26. 检查PHP类是否已被调用
- 27. 是否可以在类中使用cURL回调函数?
- 28. 是否在ObjectiveC中调用超类问题的方法?
- 29. 在Ruby on Rails中,子类是否继承父类的关联?
- 30. 是否可以在一个类中创建子类?
有效的Java - 项目7:避免终结器。如果你确实使用了终结器,你应该调用super.finalize()。 – assylias 2012-07-07 22:26:46
那么当子类被垃圾收集时,finalize()会被调用超类吗? – user997112 2012-07-07 22:29:50
伟大的文章,我认为有相关性:[为什么Finalize保护](http://www.0xcafefeed.com/2005/09/why-is-finalize-method-protected/)。 – 2012-07-07 22:30:43