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
}