Kotlin 2.1.0 入门教程(三)

devtools/2025/1/21 6:30:16/

变量

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

使用 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 不可再次赋值。
}

http://www.ppmy.cn/devtools/152282.html

相关文章

【STM32-学习笔记-8-】I2C通信

文章目录 I2C通信Ⅰ、硬件电路Ⅱ、IIC时序基本单元① 起始条件② 终止条件③ 发送一个字节④ 接收一个字节⑤ 发送应答⑥ 接收应答 Ⅲ、IIC时序① 指定地址写② 当前地址读③ 指定地址读 Ⅳ、MPU6050---6轴姿态传感器&#xff08;软件I2C&#xff09;1、模块内部电路2、寄存器地…

Java ArrayList

Java ArrayList 从名字就可以看得出来&#xff0c;ArrayList 实现了 List 接口&#xff0c;并且是基于数组实现的。 有人就会问了 那ArrayList和数组有什么区别呢 数组的大小是固定的&#xff0c;一旦创建的时候指定了大小&#xff0c;就不能再调整了。也就是说&#xff0c;…

1166 Summit (25)

A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…

【js进阶】设计模式之单例模式的几种声明方式

单例模式&#xff0c;简言之就是一个类无论实例化多少次&#xff0c;最终都是同一个对象 原生js的几个辅助方式的实现 手写forEch,map,filter Array.prototype.MyForEach function (callback) {for (let i 0; i < this.length; i) {callback(this[i], i, this);} };con…

Jenkins-pipeline语法说明

一. 简述&#xff1a; Jenkins Pipeline 是一种持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile&#xff1a; 1. Sections部分&#xff1a; Pipeline里的Sections通常包含一个或多个Direc…

[LeetCode] 哈希表 I — 242#有效的字母异位词 | 349#两个数组的交集 | 202#快乐数 | 1#两数之和

哈希表 基础知识常见的哈希结构数组242# 有效的字母异位词 Set基础语句349# 两个数组的交集202# 快乐数 Map基础语句1# 两数之和 基础知识 哈希表常用于快速判断一个元素是否在集合中&#xff0c;空间换时间 哈希表是根据key&#xff08;如数组的索引下标&#xff09;直接进行…

算法随笔_12:最短无序子数组

上一篇: 算法随笔_11: 字符串的排列-CSDN博客 题目描述如下: 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。请你找出符合题意的最短子数组&#xff0c;并输出它的长度。…

Cursor的composer和chat的区别

Cursor 提供了两种人机对话方式。一种是 Chat&#xff0c;它与 ChatGPT 之类的工具差别不大。另一种则是强大的 Compose。 一、长文本及程序文件处理方面 Composer 在处理长文本时表现较为稳定&#xff0c;可以对长文进行更改而不会出现内容丢失的情况。而 Chat 在更改长的程…