/** * 第 3 章 · 基本语法 — 综合示例 * * 涵盖: * - val / var / const val * - 数字类型与显式转换 * - 字符串模板(含三引号字符串) * - if 表达式 * - when 全场景(值匹配、范围、类型、无参) * - for / while / 范围 * - is / as 类型检查 * * 运行:kotlinc BasicSyntax.kt -include-runtime -d bs.jar && java -jar bs.jar */ const val APP_NAME = "Kotlin Demo" // 编译期常量 const val MAX_SCORE = 100 fun main() { println("=== 1. 变量 ===") val name = "Alice" // 类型推断为 String var age = 25 // var 可变 age += 1 val score: Double = 88.5 // 显式类型 println("$name, $age 岁,分数 $score") println("\n=== 2. 数字类型 ===") val big: Long = 1_000_000_000L val pi: Double = 3.14159 val hex: Int = 0xFF println("big=$big, pi=$pi, hex=$hex (十进制 $hex)") val i = 100 val l: Long = i.toLong() // 必须显式转换 println("Int $i 转 Long = $l") println("\n=== 3. 字符串模板 ===") println("Hello, $name!") println("$name 长度 = ${name.length}") println("一年后 ${age + 1} 岁") val sql = """ SELECT id, name, score FROM students WHERE score >= $MAX_SCORE * 0.6 """.trimIndent() println("---- 多行字符串 ----") println(sql) println("\n=== 4. if 表达式 ===") val a = 10; val b = 20 val max = if (a > b) a else b println("max($a, $b) = $max") println("\n=== 5. when 全场景 ===") listOf(0, 5, 50, 999, -10).forEach { x -> val cat = when (x) { 0 -> "零" in 1..9 -> "个位数" in 10..99 -> "两位数" in 100..999 -> "三位数" !in 0..999 -> "超出范围" else -> "其他" } println("$x -> $cat") } // when 当类型派发 listOf(1, "hello", 3.14, listOf(1,2,3)).forEach { println("${it.javaClass.simpleName}: ${describe(it)}") } // when 无参数模式 val score2 = 78 val grade = when { score2 !in 0..100 -> "无效" score2 >= 90 -> "A" score2 >= 80 -> "B" score2 >= 70 -> "C" score2 >= 60 -> "D" else -> "F" } println("分数 $score2 -> 等级 $grade") println("\n=== 6. for 循环 ===") println("升序 1..5:") for (i in 1..5) print("$i ") println() println("半开区间 1 until 5:") for (i in 1 until 5) print("$i ") println() println("倒序 5 downTo 1:") for (i in 5 downTo 1) print("$i ") println() println("步长 1..10 step 2:") for (i in 1..10 step 2) print("$i ") println() println("带索引:") val fruits = listOf("apple", "banana", "cherry") for ((idx, fruit) in fruits.withIndex()) { println(" $idx -> $fruit") } println("\n=== 7. is / as 类型检查 ===") val obj: Any = "hello world" if (obj is String) { // smart cast: 自动把 obj 当 String 用 println("是 String,长度 ${obj.length}") } val any: Any = 123 val maybeStr: String? = any as? String // 安全转换 println("any as? String = $maybeStr") // null println("\n=== 8. try 表达式 ===") val parsed: Int = try { "42a".toInt() } catch (e: NumberFormatException) { -1 } println("解析失败时返回 = $parsed") } fun describe(obj: Any): String = when (obj) { is Int -> "整数 $obj,平方是 ${obj * obj}" is String -> "字符串 \"$obj\",长度 ${obj.length}" is Double -> "浮点数 $obj,向下取整 ${obj.toInt()}" is List<*> -> "列表,含 ${obj.size} 个元素:$obj" else -> "未知类型 ${obj::class.simpleName}" }