Kotlin中val與const都有不可修改或者甚至是常量的含義,那它們存在的是否重復(fù)?有沒有差別呢?
val與const的差別
1. val的含義
-
當(dāng)它修飾局部變量時,它的含義與Java中的
final相同,讓局部變量不能被修改。如下示例fun foo(): Unit { val record: Int = 5 ........ }等同于Java中的
void foo() { final int record = 5 ........ } -
當(dāng)它修飾成員變量或頂層變量時,為不可修改的屬性。
- 注意只能說是屬性,不能說是成員變量,因?yàn)閗otlin會為
val修飾的頂層變量默認(rèn)添加一個getter方法,讓它能夠像getXXX(): XX方法一樣被訪問。 - 另一方面,它也為子類能夠重寫此成員屬性提供的可能,為它添加
open修飾后,子類override此屬性時,其實(shí)是在重寫它的getter方法。
如下示例,
class A { val record: Int = 5 ........ }等同于Java中的
class A { private final int record = 5 public int getRecord() { return this.record; } ........ } - 注意只能說是屬性,不能說是成員變量,因?yàn)閗otlin會為
2. const val的差別
這種修飾只能出現(xiàn)在頂層變量或成員變量身上。
- 當(dāng)它修飾的成員變量和頂層變量時,被修飾的變量會被處理為靜態(tài)常量。注意,這里是常量而不是屬性,因?yàn)榇藭r被修飾的變量不會被自動添加
getter方法,而是作為一個常規(guī)的靜態(tài)常量來對待。 - 因此它也不可被子類派生重寫。
- 同時,它的訪問域默認(rèn)為
public。
如下示例,
class A {
const val record: Int = 5
}
等同于Java中的
class A {
public static final int record = 5
}
3. private const val的差別
它除了第二點(diǎn)說到的特性外,主要的作用就是把const val的默認(rèn)訪問域從public改為private了。如下示例,
class A {
private const val record: Int = 5
}
等同于Java中的
class A {
private static final int record = 5
}