跳到主要内容

Kotlin 基础语法

本章将介绍 Kotlin 的基础语法,包括变量、数据类型、运算符和函数等核心概念。

程序入口

Kotlin 程序的入口是 main 函数:

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

main 函数的几种形式

// 无参形式(最常用)
fun main() {
println("Hello!")
}

// 接受命令行参数
fun main(args: Array<String>) {
println("Hello, ${args[0]}!")
}

// 简化形式(单表达式函数)
fun main() = println("Hello!")

变量声明

Kotlin 使用 valvar 声明变量:

val - 只读变量

fun main() {
// 声明不可变变量(类似 Java final)
val name: String = "Kotlin"
val age = 10 // 类型自动推断

// val 变量不能重新赋值
// name = "Java" // 编译错误!

println("Name: $name, Age: $age")
}

var - 可变变量

fun main() {
// 声明可变变量
var count = 0
println(count) // 0

count = 5
println(count) // 5

// 可以修改变量值,但不能改变类型
// count = "five" // 编译错误!
}

val vs var 对比

特性valvar
可重新赋值
类型推断
可空类型
推荐使用✅(优先)仅在必要时

最佳实践:优先使用 val,只有确实需要修改变量时才使用 var

基本数据类型

Kotlin 的基本数据类型包括:

整数类型

fun main() {
// 有符号整数
val byte: Byte = 127 // 8位: -128 ~ 127
val short: Short = 32767 // 16位: -32768 ~ 32767
val int: Int = 2147483647 // 32位(默认)
val long: Long = 9223372036854775807 // 64位

// 无符号整数(Kotlin 1.3+)
val uByte: UByte = 255u // 0 ~ 255
val uShort: UShort = 65535u // 0 ~ 65535
val uInt: UInt = 4294967295u // 0 ~ 4294967295
val uLong: ULong = 18446744073709551615u // 最大值

// 数字字面量
val decimal = 100 // 十进制
val hex = 0xFF // 十六进制
val binary = 0b1010 // 二进制
val longNum = 100_000_000 // 下划线分隔(提高可读性)

println("Byte: $byte, Int: $int, Long: $long")
}

浮点类型

fun main() {
// 浮点数
val float: Float = 3.14f // 32位,需要 f 或 F 后缀
val double: Double = 3.14 // 64位(默认)

// 科学计数法
val scientific = 1.5e10

// 特殊值
val infinity = Double.POSITIVE_INFINITY
val negativeInfinity = Double.NEGATIVE_INFINITY
val notANumber = Double.NaN

println("Float: $float, Double: $double")
}

字符类型

fun main() {
val char: Char = 'A'
val chinese: Char = '中'
val unicode: Char = '\u0041' // Unicode

// 字符可以是转义序列
val newline = '\n'
val tab = '\t'

println("Char: $char, Chinese: $chinese")
}

布尔类型

fun main() {
val isKotlin: Boolean = true
val isJava: Boolean = false

// 布尔运算
val andResult = isKotlin && isJava // false
val orResult = isKotlin || isJava // true
val notResult = !isKotlin // false

println("AND: $andResult, OR: $orResult")
}

字符串类型

fun main() {
// 普通字符串
val str: String = "Hello, Kotlin"

// 原始字符串(多行)
val rawString = """
这是第一行
这是第二行
不会有转义
""".trimIndent()

// 字符串模板
val name = "Kotlin"
val greeting = "Hello, $name" // 简单变量
val length = "Length: ${name.length}" // 表达式

println(greeting)
println(length)
}

类型推断

Kotlin 具有强大的类型推断能力:

fun main() {
// 自动推断为 Int
val a = 10

// 自动推断为 String
val b = "Hello"

// 显式声明类型
val c: Int = 20

// 如果变量未初始化,必须显式声明类型
val d: Int // 只有声明没有初始化
d = 30

println("a: ${a::class.simpleName}, b: ${b::class.simpleName}")
}

运算符

算术运算符

fun main() {
val a = 10
val b = 3

println("a + b = ${a + b}") // 13
println("a - b = ${a - b}") // 7
println("a * b = ${a * b}") // 30
println("a / b = ${a / b}") // 3 (整数除法)
println("a % b = ${a % b}") // 1 (余数)

// 浮点除法
println("a.toDouble() / b = ${a.toDouble() / b}") // 3.333...
}

赋值运算符

fun main() {
var x = 10

x += 5 // x = x + 5
x -= 3 // x = x - 3
x *= 2 // x = x * 2
x /= 4 // x = x / 4
x %= 3 // x = x % 3

println("x = $x")
}

比较运算符

fun main() {
val a = 10
val b = 20

println("a == b: ${a == b}") // false
println("a != b: ${a != b}") // true
println("a > b: ${a > b}") // false
println("a < b: ${a < b}") // true
println("a >= b: ${a >= b}") // false
println("a <= b: ${a <= b}") // true
}

逻辑运算符

fun main() {
val x = 10
val y = 20

// && - 短路与
println(x > 0 && y > 0) // true

// || - 短路或
println(x > 0 || y < 0) // true

// ! - 取反
val flag = true
println(!flag) // false
}

in / !in 运算符

检查元素是否在区间或集合中:

fun main() {
val x = 5
val range = 1..10

println(x in range) // true
println(x !in range) // false

// 区间
println(x in 1..10) // true

// 字符串
val str = "Kotlin"
println("Kot" in str) // true
}

is / !is 运算符

类型检查(智能转换):

fun main() {
val obj: Any = "Hello"

// 类型检查
println(obj is String) // true
println(obj !is Int) // true

// 智能转换
if (obj is String) {
// 在这个分支,obj 自动转换为 String
println(obj.length) // 5
}
}

注释

Kotlin 的注释与 Java 相同:

// 这是单行注释

/*
* 这是
* 多行注释
*/

/**
* 这是文档注释
* 用于生成 API 文档
* @param name 参数说明
* @return 返回值说明
*/
fun greet(name: String): String {
return "Hello, $name"
}

注意:Kotlin 的块注释可以嵌套,而 Java 不可以。

代码风格

语句结束

Kotlin 中每条语句不需要分号结尾(但加也不会报错):

fun main() {
// 不需要分号
val a = 10
val b = 20

// 单行可以写多条语句(不推荐)
val c = 30; val d = 40
}

大括号

Kotlin 要求使用大括号,即使是单行语句:

// 正确
if (a > b) {
println("a > b")
}

// 错误(编译不过)
// if (a > b)
// println("a > b")

命名规范

  • 包名:全小写,如 com.example.myapp
  • 类名:首字母大写,驼峰命名,如 MyClass
  • 函数名:首字母小写,驼峰命名,如 myFunction
  • 常量:全大写,下划线分隔,如 MAX_VALUE
  • 变量:首字母小写,驼峰命名,如 myVariable

类型转换

Kotlin 不会自动进行类型转换,需要显式调用转换函数:

fun main() {
val intNum: Int = 100
val longNum: Long = intNum.toLong() // 显式转换
val doubleNum: Double = intNum.toDouble()
val string: String = intNum.toString()

// 字符串转数字
val str = "123"
val num = str.toInt()

// 安全转换(失败返回 null)
val safeNum: Int? = str.toIntOrNull()

println("Converted: $longNum, $doubleNum, $string")
}

数字类型转换

fun main() {
// Int 转其他类型
val i: Int = 10
val l: Long = i.toLong()
val d: Double = i.toDouble()
val f: Float = i.toFloat()
val b: Byte = i.toByte()
val s: Short = i.toShort()

// 强制转换(可能丢失精度)
val bigNum = 1000L
val smallInt = bigNum.toInt() // 安全转换

// 截断行为
val pi = 3.99
println(pi.toInt()) // 3,小数部分被截断
}

可空类型

Kotlin 在类型系统层面支持可空类型:

fun main() {
// 非空类型
var name: String = "Kotlin"
// name = null // 编译错误!

// 可空类型(? 表示可以为空)
var nullableName: String? = "Kotlin"
nullableName = null // 正确

// 安全调用(?.)
val length = nullableName?.length // null

// Elvis 操作符(?:)
val len = nullableName?.length ?: 0 // 0

// 非空断言(!!)
// val len2 = nullableName.length // 编译错误
val len2 = nullableName!!.length // 可能抛出异常

println("Length: $length, $len")
}

小结

本章我们学习了:

  1. 程序入口main 函数是 Kotlin 程序的起点
  2. 变量声明val(只读)和 var(可变)
  3. 基本数据类型:整数、浮点、字符、布尔、字符串
  4. 类型推断:Kotlin 自动推断变量类型
  5. 运算符:算术、比较、逻辑、in/is 等
  6. 注释:单行、多行、文档注释
  7. 类型转换:需要显式调用转换函数
  8. 可空类型:通过 ? 支持空值

练习

  1. 声明一个 val 变量存储你的名字,一个 var 变量存储你的年龄
  2. 计算并打印 1 到 100 的总和
  3. 判断一个数是奇数还是偶数
  4. 使用字符串模板打印 "Hello, [名字]!"
  5. 创建一个可能为空的变量,并使用安全调用获取其长度