变量
在 Kotlin 中,可以通过关键字 val
或 var
声明变量,后跟变量名称。
使用 val
关键字声明只能赋值一次的变量。这些是不可变的、只读的局部变量,初始化后不能重新赋值。
kotlin">fun main() {val a = 1val b: Int = 2println("a = $a, b = $b") // a = 1, b = 2
}
kotlin">fun main() {val a = 1val b: Int = 2// a = 2 // error// b = 3 // error
}
使用 var
关键字声明可以重新赋值的变量。这些是可变变量,您可以在初始化后更改它们的值。
kotlin">fun main() {var a = 1var b: Int = 2a = 2b = 3println("a = $a, b = $b") // a = 2, b = 3
}
Kotlin 支持类型推断,可以自动识别已声明变量的数据类型。在声明变量时,可以省略变量名后的类型。
只能在初始化变量后使用它们。您可以在声明时初始化变量,也可以先声明变量稍后再初始化。在第二种情况下,必须指定数据类型。
kotlin">fun main() {val a = 1val b: Intb = 3println("a = $a, b = $b") // a = 1, b = 3
}
kotlin">fun main() {val a: Int// println("a = $a") // error
}
可以在顶层声明变量。
变量可以独立于类和函数在文件的顶层声明。
kotlin">// 顶层变量。
val name = "bob"
var age = 25fun main() {println("name = $name, age = $age") // name = bob, age = 25age = 26 // 修改顶层变量。println("update age = $age") // update age = 26
}
创建类和实例
可以通过 class
关键字定义类。
kotlin">class Person(val name: String, var age: Int) {fun greet() {println("name = $name, age = $age")}
}fun main() {val person = Person("xiaoming", 25)person.greet() // name = xiaoming, age = 25
}
类的属性可以直接在主构造函数中声明,也可以在类体中定义。
kotlin">class Person(val name: String, var age: Int) { // 在主构造函数中声明属性。var address: String = "" // 在类体中定义属性。fun greet() {println("$name, $age, $address")}
}fun main() {val person = Person("xiaoming", 25)person.address = "beijing"person.greet() // xiaoming, 25, beijing
}
kotlin">class Rectangle(val height: Double, val length: Double) {val perimeter = (height + length) * 2
}fun main() {val rect = Rectangle(2.0, 3.0)println(rect.perimeter) // 10.0
}
类之间的继承通过冒号 :
声明。
类默认是 final
的。要使类可继承,请将其标记为 open
。
kotlin">open class Animal(val name: String) { // 标记为 open 以允许继承。fun makeSound() {println("$name make sound")}
}class Dog(name: String): Animal(name) {fun bark() {println("$name bark")}
}fun main() {val dog = Dog("xiaohuang")dog.makeSound() // xiaohuang make sounddog.bark() // xiaohuang bark
}
kotlin">open class Shapeclass Rectangle(val height: Double, val length: Double): Shape() {val perimeter = (height + length) * 2
}
注释
Kotlin 支持单行注释和多行注释。
多行注释可以嵌套。
kotlin">// .............
kotlin">/* .......................................
*/
kotlin">/* ........................../* .......................................*/..........................
*/
字符串模板
kotlin">var a = 1// 模板中的简单名称。
val s1 = "a is $a" a = 2// 模板中的任意表达式。
val s2 = "${s1.replace("is", "was")}, but now is $a"
条件表达式
kotlin">fun maxOf(a: Int, b: Int): Int {if (a > b) {return a} else {return b}
}
if
也可以用作表达式。
kotlin">fun maxOf(a: Int, b: Int) = if (a > b) a else bval a = 10
val b = 20
val max = if (a > b) a else b
循环
kotlin">val items = listOf("apple", "banana", "kiwifruit")for (item in items) {println(item)
}
kotlin">val items = listOf("apple", "banana", "kiwifruit")var index = 0while (index < items.size) {println("item at $index is ${items[index]}")index++
}
when
表达式
kotlin">fun describe(obj: Any): String =when (obj) {1 -> "One""Hello" -> "Greeting"is Long -> "Long"!is String -> "Not a string"else -> "Unknown"}
范围
使用 in
和 !in
操作符检查值是否在范围内。
kotlin">val x = 10
val y = 9if (x in 1 .. y + 1) {println("fits in range")
}
kotlin">val list = listOf("a", "b", "c")if (-1 !in 0 .. list.lastIndex) {println("-1 is out of range")
}if (list.size !in list.indices) {println("list size is out of valid list indices range, too")
}
遍历范围。
kotlin">fun main() {for (x in 1 .. 5) {print(x) // 12345}println()for (x in 1 .. 10 step 2) {print(x) // 13579}println()for (x in 9 downTo 0 step 3) {print(x) // 9630}
}
集合
遍历集合。
kotlin">fun main() {val items = listOf("aaa", "bbb", "ccc")// aaa// bbb// cccfor (item in items) {println(item)}
}
使用 in
操作符检查集合是否包含某个对象。
kotlin">fun main() {val items = listOf("aaa", "bbb", "ccc")// bbbwhen {"ddd" in items -> println("ddd")"bbb" in items -> println("bbb")}
}
可空值和空值检查
当可能为 null
值时,引用必须显式标记为可空。可空类型的名称以 ?
结尾。
kotlin">fun main() {val str: String = "abc"val int: Int? = str.toIntOrNull()// nullif (int == null) {println("null")} else {println(int)}
}
在空值检查后,可空类型会自动转换为非空类型。
kotlin">fun main() {val x: Int? = 5val y: Int? = 10if (x != null && y != null) {val xx: Int = xval yy: Int = yval result: Int = xx * yyprintln(result) // 50}
}
kotlin">fun main() {val x: Int? = 5println(x is Int?) // trueif (x != null) {println(x is Int) // true}
}
类型检查和自动类型转换
is
和 !is
操作符检查表达式是否是某个类型的实例。
如果对不可变的局部变量或属性进行了特定类型的检查,则无需显式转换它,编译器会自动将其转换为目标类型。
kotlin">fun main() {check("1223")
}fun check(obj: Any) {println(obj is Any) // trueif (obj !is Int) {println(obj is Any) // true}if (obj is String) {println(obj is String) // trueprintln(obj.length) // 4}println(obj is Any) // true
}
kotlin">fun main() {check(1223)
}fun check(obj: Any) {println(obj is Any) // trueif (obj !is String) {println(obj is Any) // true}if (obj is Int) {println(obj is Int) // trueprintln(obj - 1222 == 1) // true}println(obj is Any) // true
}
kotlin">fun getStringLength(obj: Any): Int? {if (obj is String && obj.length > 0) {return obj.length}return null
}
kotlin">fun main() {check(1223)
}fun check(int: Int) {// int = 1 // int 是 val 不可再次赋值。
}