
3.1 基础语法
本节主要介绍Kotlin使用的基本数据类型、包名和引用、流程控制、返回和跳转等基础语法。
3.1.1 基本数据类型
Kotlin使用的基本数据类型包括:数值型、字符型、布尔型、数组和字符串。
数值型分为整数和浮点数。整数有8种类型,如表3.1所示。
表3.1 Kotlin中整数的类型

浮点数有Float和Double两种类型,如表3.2所示。
表3.2 Kotlin中浮点数的类型

Kotlin不允许隐式转换类型。例如,方法printDouble()的参数是Double类型的,调用该方法时,参数必须是Double类型的。每种类型都提供了如下显式转换方法。
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char

注意:Long类型的数字的结尾有L,如123L。十六进制数以0X开头,如0X0F。二进制数以0b开头,如0b00001011。Float类型的数字的结尾有f或F。无符号数值,以u或U结尾。无符号长整数以uL或UL结尾。
数值也支持用“_”增强可读性,如下面的代码所示:

注意:这些数值类型可为空时(例如,Int?),数值是包装类,其他情况下的数值是基本数据类型。包装类的值相等,但是内存地址不同,如下面的代码所示:

数值类型支持使用==、!=、>、<、>=、<=进行范围判断。此外,Int和Long类型的数值支持如下位运算。
shl(bits)—有符号数值左移
shr(bits)—有符号数值右移
ushr(bits)—无符号数值右移
and(bits)—按位与
or(bits)—按位或
xor(bits)—按位异或
inv()—按位取反

字符类型的关键字是Char。字符类型用单引号,如'a'。字符类型不能直接转换为数值类型,需要进行显式转换。此外,如果字符类型可为空,其是包装类,而不是基本数据类型。
布尔类型的关键字是Boolean,只有两个取值true和false。如果布尔类型可为空,其也是包装类。布尔类型支持&&、||、!三种运算符。
数组类型的关键字是Array,可以用arrayOf()创建一个数组,例如,arrayOf(1,2,3)表示数组[1,2,3]。数组有get()和set()方法,可以用[]替代这两个方法,举例如下:

Kotlin提供byteArray、shortArray和intArray等用于创建不同类型的数组。

String表示字符串。字符串是不可变对象,可以用[i]遍历每一个字符。

可以用“+”拼接字符串:

字符串可以由"""分割,包含换行符:

在上面这个例子中,每行都输出了很多空格,可以用trimMargin()方法去除空格,每行都有一个“|”前缀,也可以自定义前缀,如“>”,调用trimMargin(">")即可:

Kotlin的String支持模板,在字符串中使用"$"可嵌入模板:

如果需要单独使用$,可以参考如下代码来实现:

3.1.2 包名和引用
Kotlin的源码中一般都有一个包名,所有的类和方法等都在这个包下:

在上面这个例子中,printMessage的全名是io.kang.chapter03.basicsyntax.printMessage,Message的全名是io.kang.chapter03.basicsyntax.Message。
每一个Kotlin文件在JVM平台中会默认引入如下包:
kotlin.*
kotlin.annotation.*
kotlin.collections.*
kotlin.comparisons.*(从1.1版本开始)
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
java.lang.*
kotlin.jvm.*
我们可以引入一个类,也可以引入包中的所有内容,为了避免命名冲突,还可以给引用起别名:

3.1.3 流程控制
Kotlin的流程控制语句有if、when、for、while。if的分支可以是代码块,最后的表达式作为该块的值。

when语句类似于switch,when将它的参数与所有的分支条件顺序比较,直到某个分支满足条件。when既可以被当作表达式使用,也可以被当作语句使用。

for语句可以对任何提供迭代器(iterator)的对象进行遍历。

While、do…while在Kotlin中的用法和在Java中相同。
3.1.4 返回和跳转
Kotlin有以下三种跳转表达式:
return—默认从最直接包围它的函数或者匿名函数返回。
break—终止最直接包围它的循环。
continue—继续下一次最直接包围它的循环。
在Kotlin中,任何表达式都可以用标签(label)来标记。标签的格式为在标识符后跟@符号,例如abc@。可以用标签限制return、break、continue,举例如下:
