java - 在java中继承final方法有什么用?如果我们不能覆盖它
问题描述
我在学习 java 基础知识时遇到了这个final关键字。并阅读可以继承最终方法。但是我们不能覆盖那个方法。那么继承任何 final 方法有什么用呢?为什么要这样做?
解决方案
遗产
方法的继承使该方法可用于在子类中调用。调用方法显然很有用。
当在子类上调用方法名时,Java 运行时首先查看子类是否有这样的方法。如果找到,则执行该方法的实现。如果未找到,Java 运行时会在超类中查找此类方法。如果找到,则执行该方法的实现。如果没有找到,Java 运行时会查找超类的超类,依此类推。
覆盖
覆盖意味着您不想调用超类中的方法,而是子类提供了在调用该方法名称时使用的替代(或附加)行为。在某些课程中,允许替代/附加行为可能是有风险的。
事实上,普遍观点似乎正在朝着所有方法都应该是最终的立场发展,直到类作者确定允许特定覆盖是必要或有用的情况以证明潜在风险是合理的。(类似的智慧似乎正在增长,即类最初应该被设计为不可变的,直到确定了对可变性的特定需求。)
密封类
密封类/接口的未来特性为这个问题带来了另一个变化。密封类仅允许通过编译时已知的显式子类列表进行继承。
在密封类中,方法final
只能由其已知子类继承(非)。编译器和 Java 运行时环境考虑到允许的子类列表,消除了其他类稍后添加意外行为的风险。
您现在可以在 Java 16中尝试将密封类作为预览功能。该功能将于 2021年 9月在 Java 17中发布。
推荐阅读
- oracle - 未使用可传输表空间复制的列
- asp.net-mvc - 如何将 Mvc 路由空间(如“%20”)更改为“-”
- elasticsearch - ElasticSearch 集群最终开始在搜索中返回错误的 hits.total
- javascript - 反应范围滑块值气泡
- html - 无论屏幕大小如何,如何使 svg 占据屏幕的 100%
- python-3.x - 使用python的每个小时的月平均值
- docker - 在 Rancher 上更改 docker 登录凭据
- javascript - 尝试提交一个 Javascript 表单,然后提交两个表单
- javascript - 如何在 Google App Script 中执行数组操作?
- regex - 将这些重写器添加到 .htaccess 时无法访问资产