IT评测·应用市场-qidao123.com

标题: Kotlin 2.1.0 入门教程(三) [打印本页]

作者: 八卦阵    时间: 2025-1-22 23:40
标题: Kotlin 2.1.0 入门教程(三)
变量

Kotlin 中,可以通过关键字 val 或 var 声明变量,后跟变量名称。
使用 val 关键字声明只能赋值一次的变量。这些是不可变的、只读的局部变量,初始化后不能重新赋值。
  1. fun main() {
  2.     val a = 1
  3.     val b: Int = 2
  4.     println("a = $a, b = $b") // a = 1, b = 2
  5. }
复制代码
  1. fun main() {
  2.     val a = 1
  3.     val b: Int = 2
  4.     // a = 2 // error
  5.     // b = 3 // error
  6. }
复制代码
使用 var 关键字声明可以重新赋值的变量。这些是可变变量,您可以在初始化后更改它们的值。
  1. fun main() {
  2.     var a = 1
  3.     var b: Int = 2
  4.     a = 2
  5.     b = 3
  6.     println("a = $a, b = $b") // a = 2, b = 3
  7. }
复制代码
Kotlin 支持类型推断,可以自动识别已声明变量的数据类型。在声明变量时,可以省略变量名后的类型。
只能在初始化变量后使用它们。您可以在声明时初始化变量,也可以先声明变量稍后再初始化。在第二种环境下,必须指定命据类型。
  1. fun main() {
  2.     val a = 1
  3.     val b: Int
  4.     b = 3
  5.     println("a = $a, b = $b") // a = 1, b = 3
  6. }
复制代码
  1. fun main() {
  2.     val a: Int
  3.     // println("a = $a") // error
  4. }
复制代码
可以在顶层声明变量。
变量可以独立于类和函数在文件的顶层声明。
  1. // 顶层变量。
  2. val name = "bob"
  3. var age = 25
  4. fun main() {
  5.     println("name = $name, age = $age") // name = bob, age = 25
  6.     age = 26 // 修改顶层变量。
  7.     println("update age = $age") // update age = 26
  8. }
复制代码
创建类和实例

可以通过 class 关键字定义类。
  1. class Person(val name: String, var age: Int) {
  2.     fun greet() {
  3.         println("name = $name, age = $age")
  4.     }
  5. }
  6. fun main() {
  7.     val person = Person("xiaoming", 25)
  8.     person.greet() // name = xiaoming, age = 25
  9. }
复制代码
类的属性可以直接在主构造函数中声明,也可以在类体中定义。
  1. class Person(val name: String, var age: Int) { // 在主构造函数中声明属性。
  2.     var address: String = "" // 在类体中定义属性。
  3.    
  4.     fun greet() {
  5.         println("$name, $age, $address")
  6.     }
  7. }
  8. fun main() {
  9.     val person = Person("xiaoming", 25)
  10.     person.address = "beijing"
  11.     person.greet() // xiaoming, 25, beijing
  12. }
复制代码
  1. class Rectangle(val height: Double, val length: Double) {
  2.     val perimeter = (height + length) * 2
  3. }
  4. fun main() {
  5.     val rect = Rectangle(2.0, 3.0)
  6.     println(rect.perimeter) // 10.0
  7. }
复制代码
类之间的继续通过冒号 : 声明。
类默认是 final 的。要使类可继续,请将其标志为 open。
  1. open class Animal(val name: String) { // 标记为 open 以允许继承。
  2.     fun makeSound() {
  3.         println("$name make sound")
  4.     }
  5. }
  6. class Dog(name: String): Animal(name) {
  7.     fun bark() {
  8.         println("$name bark")
  9.     }
  10. }
  11. fun main() {
  12.     val dog = Dog("xiaohuang")
  13.     dog.makeSound() // xiaohuang make sound
  14.     dog.bark() // xiaohuang bark
  15. }
复制代码
  1. open class Shape
  2. class Rectangle(val height: Double, val length: Double): Shape() {
  3.     val perimeter = (height + length) * 2
  4. }
复制代码
注释

Kotlin 支持单行注释和多行注释。
多行注释可以嵌套。
  1. // .............
复制代码
  1. /* .............
  2.    .............
  3.    .............
  4. */
复制代码
  1. /* .............
  2.    .............
  3.    /* .............
  4.       .............
  5.       .............
  6.    */
  7.    .............
  8.    .............
  9. */
复制代码
字符串模板

  1. var a = 1
  2. // 模板中的简单名称。
  3. val s1 = "a is $a"
  4. a = 2
  5. // 模板中的任意表达式。
  6. val s2 = "${s1.replace("is", "was")}, but now is $a"
复制代码
条件表达式

  1. fun maxOf(a: Int, b: Int): Int {
  2.     if (a > b) {
  3.         return a
  4.     } else {
  5.         return b
  6.     }
  7. }
复制代码
if 也可以用作表达式。
  1. fun maxOf(a: Int, b: Int) = if (a > b) a else b
  2. val a = 10
  3. val b = 20
  4. val max = if (a > b) a else b
复制代码
循环

  1. val items = listOf("apple", "banana", "kiwifruit")
  2. for (item in items) {
  3.     println(item)
  4. }
复制代码
  1. val items = listOf("apple", "banana", "kiwifruit")
  2. var index = 0
  3. while (index < items.size) {
  4.     println("item at $index is ${items[index]}")
  5.     index++
  6. }
复制代码
when 表达式

  1. fun describe(obj: Any): String =
  2.     when (obj) {
  3.         1          -> "One"
  4.         "Hello"    -> "Greeting"
  5.         is Long    -> "Long"
  6.         !is String -> "Not a string"
  7.         else       -> "Unknown"
  8.     }
复制代码
范围

使用 in 和 !in 操纵符检查值是否在范围内。
  1. val x = 10
  2. val y = 9
  3. if (x in 1 .. y + 1) {
  4.     println("fits in range")
  5. }
复制代码
  1. val list = listOf("a", "b", "c")
  2. if (-1 !in 0 .. list.lastIndex) {
  3.     println("-1 is out of range")
  4. }
  5. if (list.size !in list.indices) {
  6.     println("list size is out of valid list indices range, too")
  7. }
复制代码
遍历范围。
  1. fun main() {
  2.     for (x in 1 .. 5) {
  3.             print(x) // 12345
  4.         }
  5.    
  6.     println()
  7.    
  8.     for (x in 1 .. 10 step 2) {
  9.         print(x) // 13579
  10.     }
  11.    
  12.     println()
  13.    
  14.     for (x in 9 downTo 0 step 3) {
  15.         print(x) // 9630
  16.     }
  17. }
复制代码
集合

遍历集合。
  1. fun main() {
  2.     val items = listOf("aaa", "bbb", "ccc")
  3.     // aaa
  4.     // bbb
  5.     // ccc
  6.     for (item in items) {
  7.         println(item)
  8.     }
  9. }
复制代码
使用 in 操纵符检查集合是否包含某个对象。
  1. fun main() {
  2.     val items = listOf("aaa", "bbb", "ccc")
  3.     // bbb
  4.     when {
  5.         "ddd" in items -> println("ddd")
  6.         "bbb" in items -> println("bbb")
  7.     }
  8. }
复制代码
可空值和空值检查

当可能为 null 值时,引用必须显式标志为可空。可空类型的名称以 ? 末端。
  1. fun main() {
  2.     val str: String = "abc"
  3.     val int: Int? = str.toIntOrNull()
  4.    
  5.     // null
  6.     if (int == null) {
  7.         println("null")
  8.     } else {
  9.         println(int)
  10.     }
  11. }
复制代码
在空值检查后,可空类型会自动转换为非空类型。
  1. fun main() {
  2.     val x: Int? = 5
  3.     val y: Int? = 10
  4.     if (x != null && y != null) {
  5.         val xx: Int = x
  6.         val yy: Int = y
  7.         val result: Int = xx * yy
  8.         println(result) // 50
  9.     }
  10. }
复制代码
  1. fun main() {
  2.     val x: Int? = 5
  3.     println(x is Int?) // true
  4.     if (x != null) {
  5.         println(x is Int) // true
  6.     }
  7. }
复制代码
类型检查和自动类型转换

is 和 !is 操纵符检查表达式是否是某个类型的实例。
如果对不可变的局部变量或属性进行了特定类型的检查,则无需显式转换它,编译器会自动将其转换为目标类型。
  1. fun main() {
  2.     check("1223")
  3. }
  4. fun check(obj: Any) {
  5.     println(obj is Any) // true
  6.    
  7.     if (obj !is Int) {
  8.         println(obj is Any) // true
  9.     }
  10.    
  11.     if (obj is String) {
  12.         println(obj is String) // true
  13.         println(obj.length) // 4
  14.     }
  15.    
  16.     println(obj is Any) // true
  17. }
复制代码
  1. fun main() {
  2.     check(1223)
  3. }
  4. fun check(obj: Any) {
  5.     println(obj is Any) // true
  6.     if (obj !is String) {
  7.         println(obj is Any) // true
  8.     }
  9.     if (obj is Int) {
  10.         println(obj is Int) // true
  11.         println(obj - 1222 == 1) // true
  12.     }
  13.     println(obj is Any) // true
  14. }
复制代码
  1. fun getStringLength(obj: Any): Int? {
  2.     if (obj is String && obj.length > 0) {
  3.         return obj.length
  4.     }
  5.     return null
  6. }
复制代码
  1. fun main() {
  2.     check(1223)
  3. }
  4. fun check(int: Int) {
  5.     // int = 1 // int 是 val 不可再次赋值。
  6. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4