3、Kotlin基础知识:注释、变量以及数据类型、标识符和关键字、输入函数、输出函数、运算符、程序类型转换

各位同学,欢迎来到第三章。这一章咱们要啃的是Kotlin的“地基”。说实话,很多初学者觉得这些基础概念枯燥,恨不得直接跳过去写业务逻辑。但我得提醒你——地基不牢,后面写代码会处处踩坑。我自己带团队时,见过太多因为基础概念模糊导致的低级bug,改起来比重新写还费劲。

好,废话不多说,咱们直接开干。

3.1 注释:代码里的“便签纸”

注释这东西,说白了就是写给程序员自己看的说明文字。编译器会直接忽略它,所以怎么写都不会影响程序运行。

Kotlin支持三种注释方式:

  • 单行注释:用 // 开头,整行都会被忽略。
  • 多行注释:用 /* ... */ 包裹,可以跨多行。
  • 文档注释:用 /** ... */ 包裹,通常用于生成API文档。
// 这是单行注释,我习惯在复杂逻辑前加一行说明

/*
  这是多行注释
  可以写好几行
  但别写太多,代码本身应该自解释
*/

/**
 * 这是文档注释
 * @param name 用户姓名
 * @return 问候语
 */
fun greet(name: String): String {
    return "Hello, $name"
}
我的小建议:注释不是越多越好。好的代码本身就像一篇好文章,变量名、函数名起得清晰,注释只是锦上添花。我曾经接手过一个项目,注释比代码还多,结果注释全是过时的——那才叫一个坑。

3.2 变量与数据类型:存东西的“盒子”

变量,你可以把它想象成一个带标签的盒子。标签就是变量名,盒子里装的就是数据。

Kotlin声明变量有两种方式:

  • val:不可变引用(只读),相当于Java里的 final。一旦赋值,不能再改。
  • var:可变引用,可以重新赋值。
val name = "张三"  // 不可变,后面不能改
var age = 25       // 可变,可以改
age = 26           // 没问题
// name = "李四"   // 编译错误!

这里有个原则:能用val就别用var。为什么?因为不可变的数据在多线程环境下更安全,代码也更容易推理。我早期写Kotlin时,图省事全用var,结果调试一个并发bug调了整整两天——从那以后,我默认都用val。

数据类型

Kotlin是强类型语言,但支持类型推断。也就是说,你声明变量时可以不写类型,编译器会自动推断。

类型 描述 示例
Int 整型(32位) val a: Int = 10
Long 长整型(64位) val b = 100L
Double 双精度浮点 val c = 3.14
Float 单精度浮点 val d = 3.14f
Boolean 布尔值 val e = true
Char 单个字符 val f = 'A'
String 字符串 val g = "Hello"
注意:Kotlin没有基本类型,一切都是对象。比如 Int 在运行时可能会被优化为Java的 int,但你在代码层面可以调用它的方法,比如 10.toString()

3.3 标识符和关键字:起名字的规矩

标识符就是你给变量、函数、类起的名字。Kotlin的命名规则很简单:

  • 只能包含字母、数字、下划线(_
  • 不能以数字开头
  • 不能是关键字(比如 ifelseclass 等)

关键字就是语言保留的词,有特殊含义。比如 fun 用来声明函数,val 用来声明只读变量。你不能拿它们当变量名。

// 合法的标识符
val userName = "admin"
val _count = 100
val $name = "特殊"  // 美元符号也可以,但不推荐

// 不合法的标识符
// val 123abc = "错误"  // 数字开头不行
// val class = "错误"   // 关键字不行
避坑指南:我曾经见过有人用 `if`(反引号包裹)做变量名,这在Kotlin里是允许的,但千万别这么干。代码是写给人看的,不是写给编译器看的。

3.4 输入与输出:和程序“对话”

输出很简单,用 println()print()。区别在于 println 会换行,print 不会。

println("Hello, Kotlin!")  // 输出并换行
print("不换行")             // 输出不换行

输入稍微麻烦一点。Kotlin标准库提供了 readLine() 函数,它会从控制台读取一行字符串。

println("请输入你的名字:")
val name = readLine()
println("你好,$name")

注意,readLine() 返回的是 String?(可空字符串),因为用户可能什么都不输入直接按回车。后面我们会讲怎么处理可空类型。

我的经验:在实际项目中,很少直接用 readLine() 做输入。更多是用 Scanner 或者第三方库。但作为学习,它足够简单直观。

3.5 运算符:让数据“动起来”

运算符就是用来操作数据的符号。Kotlin的运算符和大多数语言类似,但有几个细节值得注意。

算术运算符

+-*/%(取余)。注意整数除法会截断小数部分。

val a = 10 / 3   // 结果是3,不是3.333
val b = 10.0 / 3 // 结果是3.333...,因为用了浮点数

比较运算符

==!=<><=>=。Kotlin的 == 比较的是结构相等(内容),而不是引用相等。引用相等用 ===

逻辑运算符

&&(与)、||(或)、!(非)。短路求值——如果左边已经能确定结果,右边就不会执行。

位运算符

Kotlin用函数代替了符号:andorxorinvshlshrushr

val flags = 0b1010
val mask = 0b1100
val result = flags and mask  // 结果是0b1000
注意:Kotlin没有Java里的 ++-- 运算符。想自增?用 += 1 吧。这是有意设计的,为了避免 i++++i 带来的混淆。

3.6 类型转换:把数据“变形”

Kotlin是强类型语言,不同类型之间不能直接赋值。比如你不能把 Int 直接赋给 Long 变量。

val intVal: Int = 100
// val longVal: Long = intVal  // 编译错误!
val longVal: Long = intVal.toLong()  // 显式转换

Kotlin提供了丰富的转换函数:

  • toInt()toLong()toDouble()toFloat()toString()toChar()
  • 字符串转数字:"123".toInt(),但要注意可能抛出 NumberFormatException
避坑指南:我曾经在解析用户输入时,直接用了 readLine()?.toInt(),结果用户输入了“abc”,程序直接崩溃。后来我改用 toIntOrNull(),返回null时再给用户提示——安全多了。

知识体系总览

下面这张图帮你理清本章的知识结构。别小看它,每次学完一章,回头看看这张图,能帮你把零散的知识点串起来。

Kotlin基础知识 注释 // 单行 /* 多行 */ /** 文档 */ 变量与数据类型 val / var Int, Long, Double... 类型推断 标识符与关键字 命名规则 保留关键字 输入与输出 println() readLine() 运算符 算术、比较 逻辑、位运算 类型转换 toInt(), toLong() toDouble() toIntOrNull() 打好基础,后面写代码才不慌

好了,这一章的内容就到这里。记住,基础概念虽然简单,但它们是构建复杂程序的砖瓦。我建议你每学完一个知识点,都打开IDE敲一遍代码——光看是记不住的。下一章我们会进入更“好玩”的部分:控制流和函数。到时候见。