自学内容网 自学内容网

Kotlin 2.1.0 入门教程(三)

变量

Kotlin 中,可以通过关键字 valvar 声明变量,后跟变量名称。

使用 val 关键字声明只能赋值一次的变量。这些是不可变的、只读的局部变量,初始化后不能重新赋值。

fun main() {
    val a = 1
    val b: Int = 2
    println("a = $a, b = $b") // a = 1, b = 2
}
fun main() {
    val a = 1
    val b: Int = 2
    // a = 2 // error
    // b = 3 // error
}

使用 var 关键字声明可以重新赋值的变量。这些是可变变量,您可以在初始化后更改它们的值。

fun main() {
    var a = 1
    var b: Int = 2
    a = 2
    b = 3
    println("a = $a, b = $b") // a = 2, b = 3
}

Kotlin 支持类型推断,可以自动识别已声明变量的数据类型。在声明变量时,可以省略变量名后的类型。

只能在初始化变量后使用它们。您可以在声明时初始化变量,也可以先声明变量稍后再初始化。在第二种情况下,必须指定数据类型。

fun main() {
    val a = 1
    val b: Int
    b = 3
    println("a = $a, b = $b") // a = 1, b = 3
}
fun main() {
    val a: Int
    // println("a = $a") // error
}

可以在顶层声明变量。

变量可以独立于类和函数在文件的顶层声明。

// 顶层变量。
val name = "bob"
var age = 25

fun main() {
    println("name = $name, age = $age") // name = bob, age = 25
    age = 26 // 修改顶层变量。
    println("update age = $age") // update age = 26
}

创建类和实例

可以通过 class 关键字定义类。

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
}

类的属性可以直接在主构造函数中声明,也可以在类体中定义。

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
}
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

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 sound
    dog.bark() // xiaohuang bark
}
open class Shape

class Rectangle(val height: Double, val length: Double): Shape() {
    val perimeter = (height + length) * 2
}

注释

Kotlin 支持单行注释和多行注释。

多行注释可以嵌套。

// .............
/* .............
   .............
   .............
*/
/* .............
   .............
   /* .............
      .............
      .............
   */
   .............
   .............
*/

字符串模板

var a = 1

// 模板中的简单名称。
val s1 = "a is $a" 

a = 2

// 模板中的任意表达式。
val s2 = "${s1.replace("is", "was")}, but now is $a"

条件表达式

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

if 也可以用作表达式。

fun maxOf(a: Int, b: Int) = if (a > b) a else b

val a = 10
val b = 20
val max = if (a > b) a else b

循环

val items = listOf("apple", "banana", "kiwifruit")

for (item in items) {
    println(item)
}
val items = listOf("apple", "banana", "kiwifruit")

var index = 0

while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}

when 表达式

fun describe(obj: Any): String =
    when (obj) {
        1          -> "One"
        "Hello"    -> "Greeting"
        is Long    -> "Long"
        !is String -> "Not a string"
        else       -> "Unknown"
    }

范围

使用 in!in 操作符检查值是否在范围内。

val x = 10
val y = 9

if (x in 1 .. y + 1) {
    println("fits in range")
}
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")
}

遍历范围。

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
    }
}

集合

遍历集合。

fun main() {
    val items = listOf("aaa", "bbb", "ccc")

    // aaa
    // bbb
    // ccc
    for (item in items) {
        println(item)
    }
}

使用 in 操作符检查集合是否包含某个对象。

fun main() {
    val items = listOf("aaa", "bbb", "ccc")

    // bbb
    when {
        "ddd" in items -> println("ddd")
        "bbb" in items -> println("bbb")
    }
}

可空值和空值检查

当可能为 null 值时,引用必须显式标记为可空。可空类型的名称以 ? 结尾。

fun main() {
    val str: String = "abc"
    val int: Int? = str.toIntOrNull()
    
    // null
    if (int == null) {
        println("null")
    } else {
        println(int)
    }
}

在空值检查后,可空类型会自动转换为非空类型。

fun main() {
    val x: Int? = 5
    val y: Int? = 10

    if (x != null && y != null) {
        val xx: Int = x
        val yy: Int = y
        val result: Int = xx * yy
        println(result) // 50
    }
}
fun main() {
    val x: Int? = 5
    println(x is Int?) // true

    if (x != null) {
        println(x is Int) // true
    }
}

类型检查和自动类型转换

is!is 操作符检查表达式是否是某个类型的实例。

如果对不可变的局部变量或属性进行了特定类型的检查,则无需显式转换它,编译器会自动将其转换为目标类型。

fun main() {
    check("1223")
}

fun check(obj: Any) {
    println(obj is Any) // true
    
    if (obj !is Int) {
        println(obj is Any) // true
    }
    
    if (obj is String) {
        println(obj is String) // true
        println(obj.length) // 4
    }
    
    println(obj is Any) // true
}
fun main() {
    check(1223)
}

fun check(obj: Any) {
    println(obj is Any) // true

    if (obj !is String) {
        println(obj is Any) // true
    }

    if (obj is Int) {
        println(obj is Int) // true
        println(obj - 1222 == 1) // true
    }

    println(obj is Any) // true
}
fun getStringLength(obj: Any): Int? {
    if (obj is String && obj.length > 0) {
        return obj.length
    }
    return null
}
fun main() {
    check(1223)
}

fun check(int: Int) {
    // int = 1 // int 是 val 不可再次赋值。
}

原文地址:https://blog.csdn.net/qq_19661207/article/details/145208214

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!