Kotlin 中的 val 和 var

定义

首先这两个是声明变量的关键字

val(value)—— 不可变引用。使用 val 声明的变量不能在初始化之后再次赋值。它对应的是 Java 的 final 变量

var(variable)—— 可变引用。这种变量的值可以被改变。它对应的是普通(非 final)的 Java 变量

用于属性

1
2
val age = 10
var name = "Alien"

注意:val 引用自身是不可变的,但是它指向的对象可能是可变的。如

1
2
val languages = arraylistOf("Java")
languages.add("Kotlin")

val 声明的变量会默认生成 getter 方法,var 声明的变量会默认生成 getter 和 setter 方法,当然也可以自定义,如

1
2
val age
get() = 10

这里头牵涉到一个支持字段 field,如对属性做一些判断

1
2
3
4
5
var age: Int = -1
set(value) {
field = if (value < 0) 0 else value
}
get() = if (field < 0) 0 else field

用于参数

首先 val 和 var 只能用于主构造函数中的参数,其实相当于还是作用于属性上,如

1
class Person(val name: String)

这里涉及到一个主构造函数,那么什么是主构造函数呢,如上面的例子,用括号括起来的就是主构造函数,其中省略了一个关键字 constructor,完整的写法是这样的

1
class Person constructor(val name: String)

有主构造函数自然就有从构造函数

1
2
3
4
5
class Person {
//下面这两个就是从构造函数,但是这个类并没有主构造函数
constructor(name: String)
constructor(name: String, age: Int)
}

在从构造函数和普通函数中,不可以用 val 和 var 关键字来修饰参数变量,如下面的例子,编译器会报错

1
2
3
4
5
fun play(var name: String) {
// 这里参数使用 var 修饰是会报错的,因为默认就是 val 了
// 同理下面的代码也会报错,传入函数中的参数不可以再次赋值,这点和 Java 有区别
name = ""
}