Kotlin 中的关键字 override 是用于明确表示重写超类或接口的方法和属性。
在 Java 中,可以在没有关键字的情况下重写超类的方法,这可能导致错误或打字错误。在 Kotlin 中,出于安全原则,必须在任何重写时明确指出 override,并且超类成员本身必须标记为 open。
意外隐藏基类方法(意外重写)的风险和显式管理继承成员的必要性。此外,被重写的方法必须标记为 open,否则将无法重写,会导致编译错误。
使用关键字 override 来标记超类或接口的方法和属性,这些方法和属性必须事先被标记为 open、abstract 或已为 override。
代码示例:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
关键特点:
override,不能重写方法——将产生编译错误;final,只能重写明确标记为 open 的方法;override 支持通过接口和类的多重继承。如果属性或方法没有标记为 open/abstract/override,能否重写?
不能,只有明确标记为 open/abstract/override 的成员才能在子类中被重写。
实现接口方法时,override 是必须的吗?
是的,始终如此,即使这是第一个实现级别,override 是必须的——这是 Kotlin 的语法以实现一致性。
标记为 override 的方法是否可以进一步被重写?
可以,如果该方法尚未标记为 final(默认情况下,override 会继承 open),则它可以在继承层次中被进一步重写。
开发者忘记在基类上标记 open:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // 编译错误 }
优点:
缺点:
正确的类定义和继承意图:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
优点:
缺点: