我知道val
不是final
,除非明確聲明如此,並且使用javap確認Scalac沒有將final
插入到字節碼中。val是不可變的?
因此,val
是不可變的,因爲編譯器阻止我們編寫任何試圖改變它的代碼?
我知道val
不是final
,除非明確聲明如此,並且使用javap確認Scalac沒有將final
插入到字節碼中。val是不可變的?
因此,val
是不可變的,因爲編譯器阻止我們編寫任何試圖改變它的代碼?
final
和永恆性是兩個正交的概念:
val
意味着你無法通過初始宣佈後分配任何改變它(變異)的變量:
val x = 1
x = 2 // error: reassignment to val
在JVM字節碼它是由實施創建一個私有成員和一個getter,但沒有設定裝置:
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
在子類:如果你使用var
代替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
會導致同樣的錯誤。
請查看[this](http://stackoverflow.com/a/13428362/1263942)爲什麼'val's不是'final':它們可以被覆蓋 –