Kotlin中打开和覆盖方法的区别?

open class Base { open fun v() {} fun nv() {} } class Derived() : Base() { override fun v() {} } 

这是一个例子。 有人能解释一下这个区别吗? 打开关键字是强制性的吗?

是的,在你的例子中,这两个open关键字是强制性


你必须区分open类和函数的使用。

类:如果你想从它继承,你需要一个类的open关键字。 默认情况下,所有的类都是final ,不能被继承。

功能:在需要open的功能上,可以覆盖它。 默认情况下,所有功能都是final ,你不能覆盖它们。


编辑:因为我在评论中看到了一些混乱。

pokemzok :我有一个内部的抽象类,我可以继承没有任何问题。 我也可以按照我的意愿重写它的抽象方法,而不必声明它们是公开的

抽象类意味着被继承,因为你不能实例化它们。 事实上,他们不仅仅是默认open ,他们不可能是final的。 finalabstract不兼容。 abstract方法也是一样,必须重写!

类的open注释与Java的final一个是相反的:它允许其他人从这个类继承,因为默认情况下Kotlin中的所有类都是final 。 [ 来源 ]

只有在宣布一个类为open我们才能inherit该类。

只有在基类中打开的方法才能被overridden 。 注释override通过继承类来指示基本方法的重写。

默认情况下,Kotlin中的函数被定义为final 。 这意味着你不能重写它们。 如果你从你的函数v()移除了open的函数,那么你的类中将会出现一个错误。 Derived函数v是final的,不能被覆盖。

当你open一个函数时,它不再是final ,你可以在派生类中覆盖它。