继承 java 中的 final 方法有什么用?如果我们不能覆盖它
what is the use of inheriting a final method in java ? If we cant override it
我正在研究 java 基础知识并遇到了这个 final 关键字。并且读到一个 final 方法可以被继承。但是我们不能覆盖那个方法。那么继承任何final方法有什么用呢?为什么要这样做?
继承
方法的继承使该方法可用于在子class 中调用。调用方法显然有用
当在 subclass 上调用方法名称时,Java 运行时首先查看 subclass 是否有这样的方法。如果找到,则执行该方法的实现。如果未找到,Java 运行时将查找 superclass 以查找此类方法。如果找到,则执行该方法的实现。如果未找到,Java 运行时将查找 superclass 的 superclass,依此类推。
覆盖
覆盖意味着你不想调用superclass中的方法,而subclass提供了一个替代(或附加)方法调用该方法名称时要使用的行为。在某些 classes 中,允许 alternative/additional 行为可能存在风险。
事实上,一般意见似乎正在朝着所有方法都应该是最终的立场发展,直到 class 作者确定允许特定覆盖是必要的或有用的足以证明潜在风险的情况。 (类似的智慧似乎正在增长,classes 最初应该设计为不可变的,直到建立了对可变性的特定需求。)
密封 classes
密封 classes/interfaces 的未来功能使这个问题有了另一个转折点。密封的 class 仅允许通过编译时已知的显式子 class 列表继承。
在密封的 class 中,方法只能由其已知的子class 继承(非final
)。稍后由其他 classes 添加意外行为的风险由编译器和 Java 运行时环境根据允许的子 classes 列表消除。
您可以尝试密封 classes 作为 preview feature now in Java 16. The feature is due for release in Java 17 即将到来的 2021-09。
我正在研究 java 基础知识并遇到了这个 final 关键字。并且读到一个 final 方法可以被继承。但是我们不能覆盖那个方法。那么继承任何final方法有什么用呢?为什么要这样做?
继承
方法的继承使该方法可用于在子class 中调用。调用方法显然有用
当在 subclass 上调用方法名称时,Java 运行时首先查看 subclass 是否有这样的方法。如果找到,则执行该方法的实现。如果未找到,Java 运行时将查找 superclass 以查找此类方法。如果找到,则执行该方法的实现。如果未找到,Java 运行时将查找 superclass 的 superclass,依此类推。
覆盖
覆盖意味着你不想调用superclass中的方法,而subclass提供了一个替代(或附加)方法调用该方法名称时要使用的行为。在某些 classes 中,允许 alternative/additional 行为可能存在风险。
事实上,一般意见似乎正在朝着所有方法都应该是最终的立场发展,直到 class 作者确定允许特定覆盖是必要的或有用的足以证明潜在风险的情况。 (类似的智慧似乎正在增长,classes 最初应该设计为不可变的,直到建立了对可变性的特定需求。)
密封 classes
密封 classes/interfaces 的未来功能使这个问题有了另一个转折点。密封的 class 仅允许通过编译时已知的显式子 class 列表继承。
在密封的 class 中,方法只能由其已知的子class 继承(非final
)。稍后由其他 classes 添加意外行为的风险由编译器和 Java 运行时环境根据允许的子 classes 列表消除。
您可以尝试密封 classes 作为 preview feature now in Java 16. The feature is due for release in Java 17 即将到来的 2021-09。