Kotlin 入门教程

FreeGuideOnline 最新 2026-07-15

kotlin fun main() { println("Hello, Kotlin!") }


- `fun` 关键字用于声明函数。
- `main` 是程序入口函数。
- `println()` 输出一行文本。

运行后,控制台会打印出 `Hello, Kotlin!`。

## 三、基本语法

### 3.1 变量与常量
使用 `var` 声明可变变量,`val` 声明只读变量(常量)。
```kotlin
var age: Int = 25    // 可变变量
val name: String = "Alice"  // 不可变(类似Java final)

Kotlin 具备类型推断,可以省略类型声明:

var score = 90      // 推断为 Int
val greeting = "Hi" // 推断为 String

3.2 基本数据类型

  • 数字:Int, Long, Float, Double, Short, Byte
  • 字符:Char (例如 'A'
  • 布尔:Booleantrue / false
  • 字符串:String

Kotlin 没有隐式拓宽转换,数字之间必须显式转换:

val i: Int = 10
val l: Long = i.toLong()   // 显式转换为 Long

3.3 字符串模板

使用 $ 插入变量值,或 ${} 插入表达式:

val name = "Kotlin"
println("Hello, $name!")           // Hello, Kotlin!
println("1 + 2 = ${1 + 2}")       // 1 + 2 = 3

四、控制流

4.1 条件表达式:if

if 在 Kotlin 中可作为一个表达式返回结果。

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

4.2 when 表达式

取代 Java 的 switch,功能更强大。

when (x) {
    1 -> println("x == 1")
    2, 3 -> println("x is 2 or 3")
    in 4..10 -> println("x is between 4 and 10")
    !in 11..20 -> println("x is outside 11 to 20")
    is String -> println("x is a String")  // 智能类型检查
    else -> println("none of the above")
}

4.3 循环

  • for 循环可遍历任何可迭代对象:
for (i in 1..5) {
    println(i)   // 打印1 2 3 4 5
}
val list = listOf("a", "b", "c")
for (item in list) {
    println(item)
}
  • whiledo..while 同 C 系语言一致。

五、函数

5.1 函数声明

fun add(a: Int, b: Int): Int {
    return a + b
}

如果函数体是单个表达式,可简写:

fun add(a: Int, b: Int) = a + b

5.2 默认参数与具名参数

fun greet(name: String = "Guest", message: String = "Welcome") {
    println("$message, $name!")
}
greet()                        // 使用全部默认值
greet("Alice")                 // 按顺序赋值
greet(message = "Hello", name = "Bob") // 具名参数

六、空安全(Null Safety)

Kotlin 通过类型系统彻底避免空指针异常。

  • 普通类型不可为 null:var s: String = null 会报错。
  • 可空类型需加 ?var s: String? = null 合法。
  • 调用前需进行安全调用 ?. 或使用 !!(非空断言,慎用)。
val length = s?.length   // 如果 s 为 null,length 结果为 null,不会抛出异常
val len = s!!.length     // 强制告诉编译器 s 不为 null,若为 null 则抛出异常
  • 使用 ?: 运算符提供默认值:
val name: String? = null
val displayName = name ?: "Unknown"   // 如果 name 为 null,则 displayName = "Unknown"

七、类与对象

7.1 类声明与实例化

Kotlin 中的类声明非常简洁,不需要 new 关键字。

class Person(val name: String, var age: Int)

val person = Person("Alice", 25)
println(person.name)  // 读取属性
person.age = 26       // 修改属性

主构造函数写在类名后边,属性声明与参数合并。

7.2 数据类(Data Class)

专用于保存数据,自动生成 equals()hashCode()toString()copy() 等方法。

data class User(val id: Int, val name: String)

val user1 = User(1, "Bob")
val user2 = user1.copy(name = "Charlie")
println(user1)  // User(id=1, name=Bob)
println(user2)  // User(id=1, name=Charlie)
println(user1 == User(1, "Bob"))  // true

7.3 继承

Kotlin 中所有类默认都是 final,需用 open 关键字允许继承。

open class Animal(val name: String) {
    open fun sound() {
        println("generic sound")
    }
}

class Dog(name: String) : Animal(name) {
    override fun sound() {
        println("bark")
    }
}

八、扩展函数与属性

无需继承即可为现有类添加新功能。

// 为 String 类添加一个新函数
fun String.lastChar(): Char = this[this.length - 1]

println("Kotlin".lastChar())  // 输出 n

也可以添加扩展属性,但只能声明为 val

val String.secondChar: Char
    get() = this[1]

扩展函数在静态作用域内解析,无法重写类内部同名函数,是静态分派的。

九、集合与函数式操作

Kotlin 标准库提供了丰富的集合类型:

  • List(通常只读 listOf,可变 mutableListOf
  • SetsetOfmutableSetOf
  • MapmapOfmutableMapOf

常用的高阶函数

val numbers = listOf(1, 2, 3, 4, 5)

// filter 过滤
val evens = numbers.filter { it % 2 == 0 }  // [2, 4]

// map 转换
val squared = numbers.map { it * it }       // [1, 4, 9, 16, 25]

// 链式调用
val result = numbers.filter { it > 2 }
                     .map { it * 10 }       // [30, 40, 50]

// reduce 累积
val sum = numbers.reduce { acc, i -> acc + i }  // 15

// find, any, all 等
val hasEven = numbers.any { it % 2 == 0 } // true

十、协程入门简介

Kotlin 协程是官方提供的异步编程解决方案,能以同步方式编写异步代码。 需添加库 kotlinx.coroutines。一个极简例子:

import kotlinx.coroutines.*

fun main() = runBlocking {         // 启动一个协程作用域
    launch {                       // 启动一个新协程
        delay(1000L)               // 挂起1秒(不阻塞线程)
        println("World!")
    }
    println("Hello,")              // 主协程继续执行
    delay(2000L)                   // 等待足够时间使子协程完成
}