1 var与val
var是variable的缩写,用于声明可读写属性;
val是value的缩写,用于声明只读属性。
1.1 使用举例
var的使用如下,定义了类Person的可读写属性:
//Kotlin
class Person {
var age: Int = 0//必须负责变量声明之后的初始化
}
相当于Java的:
//Java
class Person {
public int age;
}
val的使用如下,定义了类Person的只读属性:
//Kotlin
class Person {
val age : Int = 0
}
相当于Java的:
//Java
class Person {
public final int age = 0;//必须声明时初始化
}
1.2 只读属性
注意!上面一直强调
val声明的是只读属性,而不是常量。原因很简单,Kotlin中所有的量都称为属性(Property),一般来说,属性由一个存储属性状态的属性值和它的getter、setter组成,而由val声明的只读属性只有getter,没有setter,同时,getter完全可以返回一个表达式,因此,val声明的是一个只读属性,而非常量。
例如:
//Kotlin
class Person {
val age: Int
get() {
return (Math.random()*100).toInt()
}
}
fun main() {
val person = Person()
println(person.age)//每一次运行,打印的是一个随机数,而非常量
}
2 常量
2.1 基本常量
Kotlin中声明常量需要使用const关键字,有以下几个注意事项:
- 一般常量定义在全局范围内,若定义在类的内部,需要定义成类的伴生对象,相当于Java的
static final; - 只能修饰基本数据类型;
- 必须在声明时立刻用字面量完成初始化。
//Kotlin
class P {
companion object {
const val a = 10//定义在类内部
}
}
const val b = 10//定义在全局范围内
fun main() {
println(P.a)
println(b)
}
2.2 常量引用
常量引用强调的是引用与堆上对象之间的指向关系不能变,具体对象内容是可以改变的。
2.3 编译器常量与运行时常量
例如Kotlin中:
//Kotlin
fun main() {
val c: Int
if (Math.random().toInt() * 100 % 2 == 0) {
c = 20
} else {
c = -20
}
}