我知道val
不是final
,除非明确声明,并且使用javap确认Scalac没有将final
插入字节码。
因为编译器阻止我们编写任何试图改变它的代码,所以val
是不可变的吗?
答案 0 :(得分:8)
final
和不变性是两个正交的概念:
val
表示您无法通过在初始声明后为其赋予任何内容来更改(变异)变量:
val x = 1
x = 2 // error: reassignment to val
在JVM字节码中,它是通过创建私有成员和getter来实现的,但不是setter:
class A {
val x = 1
}
=>
// Java equivalent of a generated bytecode
public class A {
private final int x;
public int x() { return x; }
...
}
final
表示您无法覆盖子类中的val
:
class A {
final val x = 1
}
class B extends A {
override val x = 2
}
// error: overriding value x in class A of type Int(1);
// value x cannot override final member
如果您使用final
而不是var
, val
会导致同样的错误。