var默认情况下是public final,但是,可重新初始化



我刚开始了解KOTLIN,我发现public final默认情况下,classes&变量。

但我很惊讶最终的变量值是怎么改变的?

public final var x = 4
x = 5

有人能帮我澄清一下吗?

final关键字严格用于继承。

如果您想要不可变的属性,请使用val而不是var

默认情况下,所有内容都是final,因此不能继承或覆盖它。如果你不希望某个东西是final,你必须明确地将其标记为open:

open class Foo {
var x = 5
}
class Foo2 : Foo() {
override var x = 7  // error : 'x' in 'Foo' is final and cannot be overridden
}
open class Bar {
open var x = 5
}
class Bar2 : Bar() {
override var x = 8  // ok
}
open class Bar3 : Bar() {
final override var x = 9  // ok, final prevents further overrides
}
class Bar3Child : Bar3() {
override var x = 10  // error : 'x' in 'Bar3' is final and cannot be overridden
}

您混淆了变量和属性。

在Java中,有成员字段变量和局部变量(函数内部(。在Kotlin中,变量只出现在函数和构造函数内部。没有成员字段(除了自定义属性getter和setter内部(,只有属性。

在Java中,任何类型的变量的final意味着您不能更改其值,但方法的final意味着您不能覆盖它

在Kotlin中,局部变量(函数中的变量(可以具有与Javafinal变量相同的行为,方法是将它们标记为val而不是var

Kotlin属性类似于一个方法(或一对方法(。将它标记为final意味着您不能覆盖它。将它标记成val意味着它没有setter,但这并不一定意味着它是不可变的,因为您可以选择为它编写一个自定义getter,每次都返回不同的值。等效于Javafinal成员字段变量的行为将是不带自定义getter函数的val属性。

对于类、函数和属性,Kotlin默认为final,因为这会带来更健壮的设计。由于final是默认的,属性允许您更容易地封装类的行为,因此public作为类和属性的默认作用域更为明智。Kotlin中甚至不存在等效的Java Default作用域。

相关内容

最新更新