猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
禁止在Java中继承的充分理由吗?
禁止在Java中进行继承的充分理由是什么,例如使用最终类或使用单个私有无参数构造函数的类?将方法定型的充分理由是什么?
繁星淼淼
浏览 355
回答 3
3回答
慕田峪9158850
这里最好的参考是Joshua Bloch的优秀著作“ Effective Java”的第19项,称为“继承的设计和文档,否则将禁止继承”。(在第二版中是第17项,在第一版中是第15项。)您应该阅读它,但我将进行总结。如果祖先不是为了继承而来的,则继承的类与父母之间的交互可能是令人惊讶且不可预测的。因此,类应分为两种:设计为可扩展的类,并提供足够的文档来描述应如何完成标记为最终课程如果您纯粹是在编写内部代码,则可能有点过大。但是,在类文件中添加五个字符所涉及的额外工作量很小。如果您仅出于内部消耗而编写,那么将来的编码人员可以随时删除“最终”,您可以将其视为警告,指出“该类在设计时并未考虑继承”。
0
0
0
RISEBY
在3个用例中,您可以使用最终方法。为了避免派生类重写特定的基类功能。这是出于安全目的,基类提供了框架的一些重要核心功能,而派生类不应该对其进行更改。最终方法比实例方法更快,因为最终和私有方法没有使用虚拟表概念。因此,只要有可能,请尝试使用最终方法。最终上课的目的:这样,任何人都无法扩展这些类并改变其行为。例如:包装器类整数是最后一堂课。如果该类不是最终类,则任何人都可以将Integer扩展到自己的类中,并更改整数类的基本行为。为了避免这种情况,java将所有包装器类都设置为最终类。
0
0
0
慕沐林林
嗯...我可以想到两件事:您可能有一个处理某些安全问题的课程。通过子类化并将其子类化的版本提供给系统,攻击者可以规避安全性限制。例如,您的应用程序可能支持插件,并且如果插件仅可以将与安全性相关的类作为子类,则它可以使用此技巧以某种方式将其子类版本走私到位。但是,这是Sun必须在小程序等方面处理的事情,也许不是这样的现实情况。一种更现实的方法是避免对象变得可变。例如,由于字符串是不可变的,因此您的代码可以安全地保留对其的引用 String blah = someOtherString;而不是先复制字符串。但是,如果可以将String子类化,则可以向其添加允许修改字符串值的方法,现在再也没有代码可以依赖它了,如果仅按上述方式复制字符串,则字符串将保持不变,而必须复制串。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
Java
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续