Kotlin笔记(二)——数据类型

时间:2021-08-12 17:26:28

上一篇文章简单的介绍了Kotlin,并且通过一段小代码帮助大家了解了Kotlin,本篇文章着重介绍一下Kotlin的数据类型。


变量和常量

在进入主题前,我们先来说一个基本的概念,常量和变量。在Kotlin中,所有的变量都是对象,所以,不存在所谓的基本类型,比如整型Int型的变量,代表的是一个Int类的对象引用,而不是其他语言中的基本类型。Kotlin定义常量使用val关键字,定义变量使用var关键字。常量值引用不可以重新指向其他的值,而变量可以将当前引用转为指向其他的引用。定义一个变量或常量的语法为

val/var 名称:数据类型 = 初始化值


例如(注意以下示例要放在main函数中执行)

//常量
val constInt: Int = 1
//constInt = 2 //会报错, 常量不允许修改引用的指向
println("常量:constInt = $constInt")

//变量
var variableInt: Int = 1
variableInt = 2
println("变量:variableInt = $variableInt")

输出为

常量:constInt = 1
变量:variableInt = 2


注意上面的代码,我们使用了$对变量进行取值打印,这是Kotlin字符串模板的语法,我们可以将变量前添加$符号直接打印,或者将简单的表达式放在${...}中打印。


除此之外,Kotlin的常量和变量还有可空类型和不可空类型的区分,对于可空类型,我们可以将null赋值给一个引用,而不可空类型则不能赋值为null,这样可以防止我们非法调用null引用而导致程序崩溃。定义可空类型的语法为

val/var 名称:数据类型? = 初始化值


就是在数据类型后添加一个?,看下面的例子

//可空
//variableInt = null //会报错
var variableNullableInt: Int? = null
println("可空:variableNullableInt = $variableNullableInt")
println("可空:variableNullableInt == null? ${variableNullableInt == null}")
//println("可空:variableNullableInt!! = ${variableNullableInt!!}") //程序崩溃

variableNullableInt = 3
println("可空:variableNullableInt = $variableNullableInt")
println("可空:variableNullableInt!! = ${variableNullableInt!!}")

例子中我们如果给之前的variableInt这个不可空变量赋值为null,则会编译报错,另外我们使用了!!操作符,该操作符可以将可空变量解封装,由于我们一开始使用了null值,!!会使程序崩溃,这就要求我们在使用可空值时,仔细想想是否需要判断是否为空。示例的运行结果如下:

可空:variableNullableInt = null
可空:variableNullableInt == null? true
可空:variableNullableInt = 3
可空:variableNullableInt!! = 3


数据类型

Kotlin的数据类型主要包括数字(Numbers),字符(Characters),布尔(Booleans),数组(Arrays)和字符串(Strings)五种。


数字类型

数字主要包括以下几种(出自官方文档)

Kotlin笔记(二)——数据类型


数字类型之间可以通过使用toXXX函数实现类型之间的相互转化,例如,我有一个Int类型的变量,调用toDouble函数,可将Int值转化为Double值

//数据类型转换
val aInt = 1
println("aInt = $aInt, aInt.toDouble() = ${aInt.toDouble()}")

输出为

aInt = 1, aInt.toDouble() = 1.0

上面的例子我们的aInt使用了Kotlin的类型推断,由于我们初始化赋值给aInt的1是一个整型,Kotlin能够自动判断出我们的aInt是一个Int类型,所以定义时我们不需要显式指明aInt是一个Int类型。


注意,对Long赋值,需要在数字后添加L,如1000L。


数字类型支持所有正常的运算,如四则运算,取余等,还可以进行位运算,由于使用较少,不再详细介绍,给出官方文档中的说明。

Kotlin笔记(二)——数据类型


字符类型

Kotlin明确说明,字符类型不属于数字类型,这是与其他一些编程语言的差别,字符类型使用单引号括起来,如'a',‘0’。


布尔类型

布尔类型相对简单,只有两个值,true和false,分别代表逻辑真和假。可以对布尔类型进行与(&&),或(||)和非(!)三种运算。


数组类型

数组类型是同一类型的数据的集合,我们可以对数组进行读写(与Java不同,Java数组是只读的)。我们有多种方法生成一个数组,分别是arrayOf函数,arrayOfNulls函数,Array构造方法以及xxxArrayOf函数,但要注意,xxxArrayOf函数生成的是具体类型的数组封装类,而不是Array<T>类型。数组的使用如下所示

//数组定义和操作
var aDoubleArray: Array<Double> = arrayOf(1.0, 2.0)
println("aDoubleArray = [${aDoubleArray[0]}, ${aDoubleArray[1]}]")

aDoubleArray[1] = 4.0
println("Changed aDoubleArray = [${aDoubleArray[0]}, ${aDoubleArray[1]}]")

aDoubleArray = Array(2, { (it + 1) * 0.5 })
println("Construct aDoubleArray = [${aDoubleArray[0]}, ${aDoubleArray[1]}]")

val aDoubleArrayNulls: Array<Double?> = arrayOfNulls<Double>(2)
println("aDoubleArrayNulls = [${aDoubleArrayNulls[0]}, ${aDoubleArrayNulls[1]}]")

val aIntArray:IntArray = intArrayOf(1, 2)
println("aIntArray = [${aIntArray[0]}, ${aIntArray[1]}]")

输出为:

aDoubleArray = [1.0, 2.0]
Changed aDoubleArray = [1.0, 4.0]
Construct aDoubleArray = [0.5, 1.0]
aDoubleArrayNulls = [null, null]
aIntArray = [1, 2]


这里重点说明一下Array构造方法,这里使用了一个超前一些的语法——Lambda表达式,Array构造方法支持两个参数,第一个参数是数组的大小,我们这里是2,第二个参数传递一个函数,函数参数是数组下标,从0开始,用来指定对应下标的数组元素的产生方式,本例中的it就是数组下标,我们生成对应元素的方法是数组下标值加1后乘以0.5,所以生成的含有两个元素的数组为[0.5, 1.0]。


字符串类型

字符串类型是用双引号("...")包含的数据,字符串如果使用我们的foreach语法,可以拆为一个个字符类型

var aString = "aeiou"
for (c in aString) {
print(c)
}

输出为

aeiou


我们还可以定义字面值字符串,比如我们想表示路径D:\aPathname,由于\字符在Kotlin中表示转义,是一个有用的字符,如果我们需要使用双引号定义方式定义上面的路径字符串,我们需要使用D:\\aPathname

//aString = "D:\aPathname" \\这样定义会报错
aString = "D:\\aPathname"

不过Kotlin提供了另外的方法,我们可以定义字符串字面值
aString = """D:\aPathname"""
println("aString = $aString")


输出为

aString = D:\aPathname


以上就是Kotlin数据类型的简单介绍,可以看到,Kotlin的数据类型并不多,使用也比较简单。

Kotlin笔记(二)——数据类型