变量
1、按作用域划分
首先Kotlin的变量按作用域划分可以分为全局变量、成员变量、临时变量。
是不是很眼熟,貌似Java也是这样划分。
var a = 1 //全局变量
class KotlinDemo {
var b = 2 //成员变量
fun main(args: Array) {
var c = 3 //局部变量
println(a)
println(b)
println(c)
}
}
在Kotlin顶级域里定义变量,该变量就是全局变量。
而Java中的全局变量是什么——static修饰的成员变量,然而Kotlin中并没有static关键字,那么Kotlin中的全局变量与Java中的全局变量是不是一样呢?
虽然两种语言的编写全局变量方式不同,其实它们是一样的,我们通过反编译以上Kotlin的字节码得到的Java代码如下:
可以看到Kotlin编译器在当前包下为我们多创建了一个KotlinDemoKt类,而我们的全局变量a就在这个类中,并且它是static修饰的:
也就是说Kotlin编译器拐弯抹角的为我们创建一个新的类,在该类中定义了全局变量。为了再次验证我们的猜想,我们把自己定义的KotlinDemo类名字改为编译器会自动生成的KotlinDemoKt,看看会怎么样?
var a = 1 //全局变量
class KotlinDemoKt { //我们手动将类名改为反编译后Kotlin生成的类名
var b = 2 //成员变量
fun main(args: Array) {
var c = 3 //局部变量
println(a)
println(b)
println(c)
}
}
很抱歉,编译是不会通过的,类名重名了:
2、按操作方式划分
这一点与Java不同,Kotlin将变量区分为 只读变量 和 可变变量。
顾名思义,一种变量只允许读取,另一种既可以读取也可以写入:
val:修饰只读变量
-
var:修饰可变变量
val a = 1 //只读变量a var b = 2 //可变变量b a = 3 //报错,a一旦赋值,不可再改变 b = 4 //没问题
3、类型推到
这个比较好理解,在初始化变量时通过右面的数据推导出该变量的数据类型,从而可以省略定义语句中的数据类型部分:
// val str :String = "abc"
val str = "abc"
println(str is String) //打印:true
类集
Kotlin中虽然在自己的包中提供了常用的数据类集,但实际还是使用的Java类集,如下图所示:
那么,既然都是用的是Java的东西,那还有什么不同呢?
Kotlin也将类集在使用方案上做了区分:
只读类集
可变类集
拿List举例,数据类型带有Mutable是可变集合(内部元素可以增、删、改),不带有Mutable是只读集合(内部元素一旦初始化,不可再增、删、改)
当然,Java提供的数据类集都属于MutableXXX的可变类集。
val arrayList = ArrayList()
arrayList.add(1) //增
arrayList[0] = 2 //改
println(arrayList[0]) //查
arrayList.removeAt(0) //删
Kotlin中变量以及类集相关的知识点也总结完毕,如有遗漏或错误,欢迎指正。