当前位置: 首页 > news >正文

Final

在本主题中,我们将讨论 Kotlin 编程语言中的 final 成员 概念。在 Java 和 C++ 等编程语言中,final 关键字用于表示一个值、方法或类不能被更改或重写。然而,在 Kotlin 中,情况略有不同。


理解 Kotlin 中的 final

在 Kotlin 中,所有类和方法默认就是 final 的。这意味着,如果你在 Kotlin 中声明一个类,它默认是不可被继承的,除非你显式地将其声明为 open。同样,类中的方法和属性默认也是 final 的,不能在子类中重写,除非你使用 open 关键字进行声明。

看下面的例子:
class MyFinalClass {fun myFinalMethod() {println("This method cannot be overridden!")}
}class MyChildClass : MyFinalClass() { // 错误!不能继承 MyFinalClassoverride fun myFinalMethod() {     // 错误!不能重写 myFinalMethodprintln("I'm trying to override your method!")}
}

在这个例子中,我们无法继承 MyFinalClass,也无法重写 myFinalMethod,因为它们默认就是 final 的。

为什么 Kotlin 要采取这种做法?
答案很简单:这种做法让代码更安全、更可预测。毕竟,如果一个类或方法可以随意被继承或重写,可能会引发各种不可控的问题。而当你显式地使用 open 关键字时,表示你清晰地表达了允许继承或重写的意图。


final vs open

如你所知,在 Kotlin 中,所有类默认是 final 的。如果你希望一个类可以被继承,或者希望方法可以被重写,你必须使用 open 关键字

open class MyBaseClass {open fun myMethod() {println("Basic implementation")}
}class MyDerivedClass : MyBaseClass() {override fun myMethod() {println("Overridden implementation")}
}

在这个例子中,MyBaseClass 和其中的 myMethod 都被声明为 open,因此 MyDerivedClass 可以继承并重写该方法。


final 可以用于重写后的方法

需要注意的是:你也可以在重写后的方法上使用 final,以防止其在后续子类中再次被重写。例如:

open class MyBaseClass {open fun myMethod() {println("Basic implementation")}
}open class MyIntermediateClass : MyBaseClass() {final override fun myMethod() {println("An overridden implementation that cannot be redefined further")}
}class MyDerivedClass : MyIntermediateClass() {override fun myMethod() { // 错误!不能重写 myMethodprintln("I'm trying to override your method!")}
}

在这个例子中,MyIntermediateClass 中的 myMethod 被声明为 final,因此 MyDerivedClass 无法再对其进行重写。


总结

总的来说,Kotlin 中的 final 机制为继承和重写提供了更严格的控制,从而让代码更加安全、清晰和可维护。这也是 Kotlin 吸引众多开发者的原因之一:默认安全、显式开放

http://www.dtcms.com/a/276137.html

相关文章:

  • 剑指offer——树:二叉树的深度
  • 【C++小白逆袭】内存管理从崩溃到精通的秘籍
  • JVM 中“对象存活判定方法”全面解析
  • JVM的垃圾回收算法和多种GC算法
  • Git 相关的常见面试题及参考答案
  • 人工智能安全基础复习用:可解释性
  • 通过渐进蒸馏实现扩散模型的快速采样
  • Java-线程池
  • 【机器学习实战笔记 16】集成学习:LightGBM算法
  • AV1高层语法
  • PostgreSQL HOT (Heap Only Tuple) 更新机制详解
  • Swin Transformer核心思路讲解(个人总结)
  • 文件上传漏洞2-常规厂商检测限制绕过原理讲解
  • 强化学习、PPO和GRPO的通俗讲解
  • C语言第一章数据类型和变量(下)
  • Java 大视界:基于 Java 的大数据可视化在智慧城市能源消耗动态监测与优化决策中的应用(2025 实战全景)
  • 视频分析应用的搭建
  • 【Linux-云原生-笔记】Apache相关
  • NE综合实验2:RIP与OSPF动态路由优化配置、FTP/TELNET服务部署及精细化访问控制
  • Java反射与注解
  • 树形动态规划详解
  • 大数据时代UI前端的智能化服务升级:基于用户情境的主动服务设计
  • 【PycharmPyqt designer桌面程序设计】
  • 【学习新知识】用 Clang 提取函数体 + 构建代码知识库 + AI 问答系统
  • GD32 CAN1和TIMER0同时开启问题
  • 《通信原理》学习笔记——第一章
  • 细谈kotlin中缀表达式
  • H2在springboot的单元测试中的应用
  • skywalking镜像应用springboot的例子
  • try-catch-finally可能输出的答案?