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的差别
这种修饰只能出现在顶层变量或成员变量身上。
- 当它修饰的成员变量和顶层变量时,被修饰的变量会被处理为静态常量。注意,这里是常量而不是属性,因为此时被修饰的变量不会被自动添加
getter方法,而是作为一个常规的静态常量来对待。 - 因此它也不可被子类派生重写。
- 同时,它的访问域默认为
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
}