Kotlin中val
與const
都有不可修改或者甚至是常量的含義矩距,那它們存在的是否重復蜡吧?有沒有差別呢高诺?
val
與const
的差別
1. val
的含義
-
當它修飾局部變量時趴樱,它的含義與Java中的
final
相同孝宗,讓局部變量不能被修改厢洞。如下示例fun foo(): Unit { val record: Int = 5 ........ }
等同于Java中的
void foo() { final int record = 5 ........ }
-
當它修飾成員變量或頂層變量時祠挫,為不可修改的屬性飒焦。
- 注意只能說是屬性蜈膨,不能說是成員變量,因為kotlin會為
val
修飾的頂層變量默認添加一個getter
方法牺荠,讓它能夠像getXXX(): XX
方法一樣被訪問翁巍。 - 另一方面,它也為子類能夠重寫此成員屬性提供的可能休雌,為它添加
open
修飾后灶壶,子類override
此屬性時,其實是在重寫它的getter
方法挑辆。
如下示例例朱,
class A { val record: Int = 5 ........ }
等同于Java中的
class A { private final int record = 5 public int getRecord() { return this.record; } ........ }
- 注意只能說是屬性蜈膨,不能說是成員變量,因為kotlin會為
2. const val
的差別
這種修飾只能出現(xiàn)在頂層變量或成員變量身上。
- 當它修飾的成員變量和頂層變量時鱼蝉,被修飾的變量會被處理為靜態(tài)常量洒嗤。注意,這里是常量而不是屬性魁亦,因為此時被修飾的變量不會被自動添加
getter
方法渔隶,而是作為一個常規(guī)的靜態(tài)常量來對待。 - 因此它也不可被子類派生重寫。
- 同時间唉,它的訪問域默認為
public
绞灼。
如下示例,
class A {
const val record: Int = 5
}
等同于Java中的
class A {
public static final int record = 5
}
3. private const val
的差別
它除了第二點說到的特性外呈野,主要的作用就是把const val
的默認訪問域從public
改為private
了低矮。如下示例,
class A {
private const val record: Int = 5
}
等同于Java中的
class A {
private static final int record = 5
}