Kotlin 基础教程:现代 JVM 语言入门
Kotlin 基础教程:现代 JVM 语言入门
Kotlin 是一门运行在 Java 虚拟机(JVM)上的静态类型编程语言,由 JetBrains 开发。它完全兼容 Java,同时提供了更简洁、安全和表达力更强的语法。本教程将带你从零开始掌握 Kotlin 的核心基础,适合拥有基本编程概念的初学者。
为什么选择 Kotlin
- 简洁:大幅减少样板代码,相同逻辑 Kotlin 通常只需 Java 的一半行数。
- 安全:类型系统中内建空安全,杜绝
NullPointerException。 - 互操作:与 Java 100% 兼容,可以无缝调用 Java 库,甚至混合编写。
- 多平台:支持 Android 开发、后端(Spring Boot)、前端(Kotlin/JS)及原生应用。
- 现代特性:支持函数式编程、扩展函数、协程等,提升开发效率。
自 2017 年 Google 宣布 Kotlin 为 Android 官方开发语言后,其社区和生态迅速成长,成为 JVM 生态中最受欢迎的现代语言之一。
环境搭建
安装 JDK
Kotlin 运行在 JVM 上,需要 JDK(Java Development Kit)8 或更高版本。
- 访问 Oracle JDK 或开源版本 Adoptium 下载安装。
- 安装后,打开终端验证:
java -version
javac -version
安装 IntelliJ IDEA
IntelliJ IDEA 是 JetBrains 官方 IDE,对 Kotlin 支持最佳。
- 下载 IntelliJ IDEA Community Edition(免费)。
- 安装完成后,启动并创建新项目,在左侧模板中选择 Kotlin,选择 JVM | IDEA,填写项目名称。
创建第一个 Kotlin 文件
在 src 目录下新建 Main.kt,编写下面的代码:
fun main() {
println("Hello, Kotlin!")
}
点击绿色三角运行,控制台会输出 Hello, Kotlin!。
基本语法
变量声明
Kotlin 使用 val 声明只读变量(类似 Java 的 final),使用 var 声明可变变量。
val name: String = "Kotlin" // 类型可省略,编译器能自动推断
var age = 5 // 推断为 Int
age = 6 // 正确
// name = "Java" // 错误,val 不可重新赋值
数据类型
Kotlin 没有基本类型和包装类的区分,所有类型都是对象。
| 类型 | 位宽 | 实例 |
|---|---|---|
| Double | 64 | 3.14 |
| Float | 32 | 3.14f |
| Long | 64 | 123L |
| Int | 32 | 123 |
| Short | 16 | 123 |
| Byte | 8 | 123 |
| Char | 16 | 'A' |
| Boolean | 1 | true / false |
| String | - | "hello" |
字符串模板
字符串内可以通过 $ 直接引用变量,或者用 ${} 放入表达式。
val name = "World"
println("Hello, $name!") // Hello, World!
println("Sum is ${1 + 2}") // Sum is 3
注释
与 Java 相同,支持单行注释 // 和多行注释 /* */。
控制流
if-else 表达式
Kotlin 中 if 是表达式,可以直接返回值。
val max = if (a > b) a else b // 直接赋值
when 表达式
when 替代 switch,功能更强大,可匹配任意对象、范围、类型等。
val x = 3
when (x) {
1 -> println("x is 1")
2, 3 -> println("x is 2 or 3")
in 4..10 -> println("x between 4 and 10")
!in 10..20 -> println("x out of range")
is Int -> println("x is Int")
else -> println("default")
}
循环
for循环遍历任何提供了迭代器的对象。
for (i in 1..5) println(i) // 1 2 3 4 5
for (i in 5 downTo 1) println(i) // 5 4 3 2 1
for (i in 1..10 step 2) println(i) // 1 3 5 7 9
while和do-while与 Java 相同。
var x = 5
while (x > 0) {
println(x--)
}
函数
函数定义
使用 fun 关键字,参数类型后置,返回类型写在参数列表后。
fun add(a: Int, b: Int): Int {
return a + b
}
单表达式函数
当函数体只有一个表达式时,可省略花括号和 return。
fun add(a: Int, b: Int) = a + b
默认参数与命名参数
参数可以指定默认值,调用时可按名称指定参数,顺序可变。
fun greet(name: String = "Guest", prefix: String = "Hello") {
println("$prefix, $name!")
}
greet() // Hello, Guest!
greet(name = "Alice") // Hello, Alice!
greet(prefix = "Hi") // Hi, Guest!
单位类型 Unit
不返回值的函数返回类型为 Unit,可省略。
fun printMessage(msg: String): Unit {
println(msg)
}
空安全
Kotlin 在类型系统中明确区分可空类型与非空类型,杜绝空指针异常。
可空类型
在类型后加 ? 表示可为 null。
var name: String = "Kotlin"
// name = null // 编译错误
var nullableName: String? = "Kotlin"
nullableName = null // 正确
安全调用操作符 ?.
如果对象非空,则执行方法或访问属性;若为空,则返回 null。
val length = nullableName?.length // 结果为 Int? 类型
Elvis 操作符 ?:
当左侧表达式为 null 时,返回右侧的值。
val len = nullableName?.length ?: 0 // len 为 Int 类型,安全保证
非空断言 !!
明确告诉编译器对象一定非空,若实际为空则抛出 NPE。
val notNullName: String = nullableName!! // 谨慎使用
安全转换 as?
如果转换失败返回 null,而不抛出异常。
val aInt: Int? = someObject as? Int
类与对象
类定义与构造函数
Kotlin 类可以声明一个主构造函数(在类头中)和多个次构造函数。
// 主构造函数直接写在类名后
class Person(val name: String, var age: Int)
// 若需要初始化代码,可放在 init 块中
class Person(val name: String) {
init {
println("Person created: $name")
}
}
创建实例不需要 new 关键字:
val person = Person("Alice", 30)
属性
Kotlin 自动为构造函数中的 val/var 生成字段和 getter/setter(var 有 setter)。
class Rectangle(var width: Int, var height: Int) {
val area: Int
get() = width * height // 自定义 getter
}
继承与接口
默认类是 final 的,需要加 open 才可继承。方法覆盖必须加 override。
open class Animal(val name: String) {
open fun sound() = println("$name makes a sound")
}
class Dog(name: String) : Animal(name) {
override fun sound() = println("$name barks")
}
接口定义与 Java 类似,但可以有默认实现。
interface Moveable {
fun move()
fun stop() { println("Stopped") }
}
数据类
使用 data class 自动生成 equals()、hashCode()、toString()、copy() 等方法。
data class User(val id: Int, val name: String)
val user1 = User(1, "Alice")
println(user1) // User(id=1, name=Alice)
对象声明与伴生对象
object 关键字直接定义单例。
object Config {
val version = "1.0"
fun show() = println("Config v$version")
}
Config.show()
伴生对象(companion object)用于在类内部定义静态成员。
class MyClass {
companion object {
const val CONSTANT = 100
fun factory() = MyClass()
}
}
val obj = MyClass.factory()
集合与函数式编程
Kotlin 提供不可变(默认)和可变集合。
创建集合
val list = listOf(1, 2, 3) // 只读 List
val mutableList = mutableListOf(1, 2, 3) // 可修改
val set = setOf("a", "b", "c") // 只读 Set
val map = mapOf("key1" to 1, "key2" to 2) // 只读 Map
Lambda 表达式
Lambda 是匿名函数,放在花括号内,参数声明在 -> 前面,函数体在后。
val sum = { x: Int, y: Int -> x + y }
println(sum(3, 5)) // 8
高阶函数与集合操作
集合提供大量高阶函数(接收函数作参数或返回值),如 filter、map、reduce 等。
val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10]
val even = numbers.filter { it % 2 == 0 } // [2, 4]
val sumOfAll = numbers.reduce { acc, n -> acc + n } // 15
Kotlin 中,如果函数的最后一个参数是 lambda,可以写在圆括号外(尾随 lambda)。
numbers.forEach { println(it) }
扩展函数与属性
无需继承或设计模式,直接为现有类添加新功能。
// 为 String 扩展一个函数
fun String.addExclamation() = this + "!"
println("Hello".addExclamation()) // Hello!
// 扩展属性
val String.lastChar: Char
get() = this.get(length - 1)
println("Kotlin".lastChar) // n
其他实用特性
解构声明
将一个对象拆成多个变量。
val (id, name) = User(1, "Alice")
println(id) // 1
println(name) // Alice
范围表达式
使用 ..、downTo、until、step 构建范围。
val range = 1..5 // 1,2,3,4,5
val untilRange = 1 until 5 // 1,2,3,4
类型别名
为类型提供替代名称,提升可读性。
typealias NameList = List<String>
fun greetAll(people: NameList) { ... }
延迟初始化
lateinit:用于可变属性,在构造后初始化。by lazy:只读属性的惰性初始化。
lateinit var database: Database
fun setup() {
database = Database()
}
val heavy by lazy { computeHeavyObject() }
总结与下一步
通过本教程,你已经掌握了 Kotlin 语言的基础知识:变量、控制流、函数、空安全、类、集合与函数式编程等核心特性。Kotlin 的简洁性与安全性能够显著提升你的开发体验。
下一步学习建议:
- 深入了解 Kotlin 协程(Coroutines)以掌握异步编程。
- 学习使用 Kotlin 开发 Android 应用(Jetpack Compose 推荐)。
- 尝试 Spring Boot + Kotlin 构建后端服务。
- 阅读官方文档 kotlinlang.org 获取最新特性。
立刻打开你的 IDE,开始用 Kotlin 写一个简单的命令行工具或 Android 应用,让知识在实践中沉淀。