1.1 创建类与实例
类的属性可以在其声明或主体中列出。具有类声明中所列参数的默认构造函数会自动可用。类之间继承由冒号(:
)声明。默认情况下类都是 final 的;如需让一个类可继承, 请将其标记为 open
。
open class Shape
class Rectangle(var height: Double, var length: Double): Shape() {
var perimeter = (height + length) * 2
}
fun main() {
val rectangle = Rectangle(5.0, 2.0)
println("The perimeter is ${rectangle.perimeter}")
}
1.2 集合
通过listOf创建集合对象,
fun main() {
val items = listOf("apple", "banana", "kiwifruit")
// 对集合进行迭代。
for (item in items) {
println(item)
}
// 使用 in 操作符来判断集合内是否包含某实例。
when {
"apple" in items -> println("apple")
"banana" in items -> println("banana")
"kiwifruit" in items -> println("kiwifruit")
}
// 使用 lambda 表达式来过滤(filter)与映射(map)集合
items
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.uppercase() }
.forEach { println(it) }
}
1.3 空值与空检测
当可能用 null
值时,必须将引用显式标记为可空。可空类型名称以问号(?
)结尾。
// 如果 str 的内容不是数字返回 null
fun parseInt(str: String): Int? {
return str.toIntOrNull()
}
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// x为null的情况
if (x == null) {
println("Wrong number format in arg1: '$arg1'")
return
}
// y为null的情况
if (y == null) {
println("Wrong number format in arg2: '$arg2'")
return
}
// 在空检测后,x 与 y 会自动转换为非空值
println(x * y)
}
fun main() {
printProduct("1", "a")
}
1.4 类型检测与自动类型转换
is
操作符检测一个表达式是否某类型的一个实例。 如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在该条件分支内自动转换成 `String`
return obj.length
}
if (obj !is String) {
// `obj` 不是 `String`的情况,直接返回null
return null
}
// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
return null
}