首页 > 解决方案 > 在java中继承final方法有什么用?如果我们不能覆盖它

问题描述

我在学习 java 基础知识时遇到了这个final关键字。并阅读可以继承最终方法。但是我们不能覆盖那个方法。那么继承任何 final 方法有什么用呢?为什么要这样做?

标签: javaoopkeywordfinal

解决方案


遗产

方法的继承使该方法可用于在子类中调用。调用方法显然很有用。

当在子类上调用方法名时,Java 运行时首先查看子类是否有这样的方法。如果找到,则执行该方法的实现。如果未找到,Java 运行时会在超类中查找此类方法。如果找到,则执行该方法的实现。如果没有找到,Java 运行时会查找超类的超类,依此类推。

覆盖

覆盖意味着您不想调用超类中的方法,而是子类提供了在调用该方法名称时使用的替代(或附加)行为。在某些课程中,允许替代/附加行为可能是有风险的。

事实上,普遍观点似乎正在朝着所有方法都应该是最终的立场发展,直到类作者确定允许特定覆盖是必要或有用的情况以证明潜在风险是合理的。(类似的智慧似乎正在增长,即类最初应该被设计为不可变的,直到确定了对可变性的特定需求。)

密封类

密封类/接口的未来特性为这个问题带来了另一个变化。密封类仅允许通过编译时已知的显式子类列表进行继承。

在密封类中,方法final只能由其已知子类继承(非)。编译器和 Java 运行时环境考虑到允许的子类列表,消除了其他类稍后添加意外行为的风险。

您现在可以在 Java 16中尝试将密封类作为预览功能。该功能将于 2021年 9月在 Java 17中发布。


推荐阅读