Contents
  1. 1. Number
    1. 1.1. 字面常量
    2. 1.2. 下划线分隔位数
    3. 1.3. 宽向扩展
  2. 2. Characters
  3. 3. Booleans
  4. 4. Arrays
  5. 5. Strings
    1. 5.1. 字符串字面量
    2. 5.2. 字符串模板

Kotlin是一门新兴的语言,它可以运行于JVM、JavaScript以及native环境(native正在开发中)。它是由著名软件开发商Jetbrains开发,具备了很多新的特性,能够在开发中提升效率。目前已经成为Android官方支持的开发语言。
Kotlin语言中的一切类型都是对象,这与Java不同。虽然Java标榜自己是一门纯粹的面向对象的语言,但由于设计的局限,还是保留了一些非面向对象的元素,最明显的就是在Java中,int、float、double、long、char等基本类型不是类,而是原生类型(primitive types)。为了补救这个缺陷,Java开发了对应的包装类型Integer、Float、Double、Long、Chararater等。
Kotlin吸收了C#等语言的设计思想,将上述基本类型内置为类,它们具有自己的成员函数和成员属性。这些基本类型包括:数字类型(numbers),字符类型(characters),布尔类型(booleans)和数组类型(arrays)。

Number

Kotlin中的数字类型与Java类似,包括Double、Float、Long、Int、Short、Byte等类型。如上文所述,它们都是类。

字面常量

Kotlin中的字面常量(literal constants)与Java类似,Int类型支持十进制,直接用普通十进制表示即可;Long类型则需跟上L后缀,如123L表示一个Long型常数,值是123。十六进制加0x前缀,如0x0F表示十六进制数,值是15。二进制加0b前缀,如0b00001011表示二进制数,值是11。Kotlin中不支持八进制数。
Kotlin支持通用的浮点数表示法,默认是Double类型,如123.5,123.5e10,如果是Float类型,需要加f或F后缀,如123.5f。

下划线分隔位数

Kotlin支持在数字常量中使用下划线分隔数位。这能使位数较多的数字具有更强的可读性。

1
2
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L

当Kotlin运行于JVM中时,number类型实际上是存储为JVM原生类型,当被赋值给可以为空(nullable)的引用时,Kotlin的number类型是对原生类型的包装。
Kotlin中,当使用一个number型常量(val)去初始化一个不可为空的number型常量时,被初始化的常量都指向内存中同一个地址。而当初始化为一个可以为空的常量时,则会在内存中不同地址创建两个常量,并将值赋给它们。

1
2
3
4
5
6
7
8
9
10
11
val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int = a
val anotherBoxedA: Int = a
print(boxedA === anotherBoxedA) // !!!Prints true!!!
val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!

但即使是赋值给可以为空的常量,依然能保证它们的相等性(equality):

1
2
3
4
val a: Int = 10000
print(a == a) // Prints 'true'
val boxedA: Int? = a val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'

宽向扩展

Kotlin中不存在隐式的宽向类型扩展,即Byte不能直接转换为Int,Int不能直接转换为Double,等等。

1
2
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR

每种number类型都能通过内置方法任意转换为另一种number类型。

Characters

字符类型用Char类表示。与Java不同,它不能被直接当做数字类型使用。

1
2
3
4
fun check(c: Char) {
if (c == 1) { // ERROR: incompatible types // ...
}
}

与Java一样,字符字面量使用单引号表示。转义字符使用反斜杠。特殊字符使用反斜杠加u加十六进制数表示。字符可以通过toInt()方法显式转换为Int。
与number一样,字符被赋值给一个nullable引用时,唯一性(identity,内存中地址相同)是不被保证的。

Booleans

用Boolean代表布尔类型,它有两个值:true和false。

布尔类型被赋值给nullable引用时,会被包装。但能保证唯一性。

1
2
3
4
5
val a: Boolean = true
println(a === a) // Prints 'true'
val boxedA: Boolean? = a
val anotherBoxedA: Boolean? = a
println(boxedA === anotherBoxedA) // Prints ‘true’

Arrays

在Java中,数组其实也是一种对象,只是我们不能显示地获得它的类型表示。在Kotlin中,用Array类来代表数组。它具有get和set方法(通过[]操作符重载了这两个函数),size属性以及其他有用的函数,如迭代器方法iterator()。

创建数组可以使用arrayOf()方法,并传递数组元素给它作为参数。例如arrayOf(1, 2, 3)就创建了一个数组[1, 2, 3]。arrayOfNulls()函数用于创建一个给定长度的数组,并用null元素填充它。

Kotlin也有特定的类代表原生类型的数组,如ByteArray、ShortArray、IntArray等。这些类与Array没有继承关系,但有对应的方法和属性集合。如IntArray有对应的工厂函数。

1
2
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]

Strings

字符串用String类表示。与Java一样,String是不可变类。String的元素是字符,与Java中必须使用charAtIndex()这样一个方法去访问元素不同,Kotlin中可以使用下标运算符[]去访问字符元素。String还能使用for循环很方便地访问。

1
2
3
for (c in str) {
println(c)
}

字符串字面量

Kotlin有两种字符串字面量:一种是可转义的字符串,它可能含有转义字符,它不能表示在多行,除非使用“+”将不同的字符串连接成一个字符串;另一种是原始(raw)字符串,能在多行表示并能包含任意文本。

转义字符串:

1
val s = "Hello, world!\n"

原始字符串:

1
2
3
val text = """
for (c in "foo") print(c)
"""

可以使用trimMargin()移除字符串开头和中间的空格,但空格的末尾必须跟上一个明确的分隔符,默认是“|”。

1
2
3
4
5
6
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin) """.trimMargin()
"""

也可以显示指定分隔符,如trimMargin(“>”)

字符串模板

在Java中,如果我们在字符串中要加入变量,必须使用加号连接,或者使用格式化字符串。而在Kotlin中,可以使用字符串模板,这将使字符串变得更加简洁,看上去也更加舒服。字符串模板以美元符号开头,直接跟上一个变量名。

1
2
3
val i = 10
val s = "i = $i" // evaluates to "i = 10"
"""

或者是一个用大括号包裹的任意的表达式。

1
2
3
val s = "abc"
val str = "$s.length is ${s.length}" // evaluates to "abc.length is 3"
"""

模板在原始字符串和转义字符串中都支持。如果你在原始字符串中需要表示美元符号的字面值,可以像下面这样使用。

1
2
3
val price = """
${'$'}9.99
"""
Contents
  1. 1. Number
    1. 1.1. 字面常量
    2. 1.2. 下划线分隔位数
    3. 1.3. 宽向扩展
  2. 2. Characters
  3. 3. Booleans
  4. 4. Arrays
  5. 5. Strings
    1. 5.1. 字符串字面量
    2. 5.2. 字符串模板