02-变量声明
4.2.1 变量声明
在Kotlin中,任何变量都是对象,这意味着任何一个变量都可以调用成员函数和属性。Kotlin的变量声明并不像Java那么复杂,变量被简单地分为可变变量(var)和不可变变量(val)两种,而不可变变量又被称为常量。
这当中,var定义的对象是可变的,这意味着任何访问这个对象的代码都可以去修改它的值。val定义的对象是不可变的,它和Java中的final很相似,对于不可变对象可以认为是线程安全的,因为所有能访问到这个线程的对象得到的结果都是同一个。
val a = "hello a!" //不可变
println(a) //输出hello a!
var b = "hello " //可变
b = "hello b!"
println(b) //输出hello b!
当然,对于可变变量var来说,也可以先声明后初始化。
var a: Int
a = 30
println(a) //输出30
不难发现,Kotlin在声明变量时可以不用指定确切的数据类型,给人的感觉就像它是一个弱类型的语言。其实不然,Kotlin是一个强类型语言,之所以不需要指定类型,是因为Kotlin的类型推理(Type inference)机制。例如,下面的情况会提示编译错误。
var name = "hello" //编译器自动推断"name"为字符串类型
name = 22 //赋值其他类型的值报错
在Java语法中,可以先定义一个变量,在使用的时候再初始化,也可以在初始化变量时设置一个默认值,防止在没有调用set方法之前就调用get方法,导致空指针报错。代码如下。
private Object data;
//直接调用本方法会报错,因为没有调用setData()
public Object getData() {
if (data==null){
data = new Object();
}
return data;
}
public void setData(Object data) {
this.data = data;
}
Kotlin的类型系统致力于消灭空引用,也就要求开发者在定义变量时进行初始化。上面的代码可以转换为如下的Kotlin写法。
private var data: Any?=null //初始化
fun getData(): Any{
if (data == null) {
data = Any()
}
return data!!
}
当然,对于var类型的变量来说,还可以使用lateinit关键字来延迟初始化,但是val变量不具备这种特性。
fun main(args: Array<String>) {
val info: Info = Info()
info.initData()
println(info.person.swim())
}
class Info {
lateinit var person: Person
fun initData() {
person = Person()
}
}
class Person{
fun swim() {
println("人会游泳...")
}
}
在定义Kotlin的变量时,应遵循以下规则。
- 定义变量时使用var关键字,定义常量使用val关键字。
- 定义变量时可以省略分号。
- print()与println()都是打印方法,后者打印完之后会换一行。
- $符号表示引用。