Kotlin请开始你的表演——04变量&类集篇

变量

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请开始你的表演——04变量&类集篇_第1张图片
image

可以看到Kotlin编译器在当前包下为我们多创建了一个KotlinDemoKt类,而我们的全局变量a就在这个类中,并且它是static修饰的:

Kotlin请开始你的表演——04变量&类集篇_第2张图片
image
Kotlin请开始你的表演——04变量&类集篇_第3张图片
image

也就是说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)
    }

}

很抱歉,编译是不会通过的,类名重名了:

image

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类集,如下图所示:

Kotlin请开始你的表演——04变量&类集篇_第4张图片
image

那么,既然都是用的是Java的东西,那还有什么不同呢?

Kotlin也将类集在使用方案上做了区分:

  • 只读类集

  • 可变类集

拿List举例,数据类型带有Mutable是可变集合(内部元素可以增、删、改),不带有Mutable是只读集合(内部元素一旦初始化,不可再增、删、改)

Kotlin请开始你的表演——04变量&类集篇_第5张图片
image

当然,Java提供的数据类集都属于MutableXXX的可变类集。

val arrayList = ArrayList()
arrayList.add(1)    //增
arrayList[0] = 2    //改
println(arrayList[0])   //查
arrayList.removeAt(0)   //删

Kotlin中变量以及类集相关的知识点也总结完毕,如有遗漏或错误,欢迎指正。

你可能感兴趣的:(Kotlin请开始你的表演——04变量&类集篇)