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" |
Int 在运行时可能会被优化为Java的 int,但你在代码层面可以调用它的方法,比如 10.toString()。
3.3 标识符和关键字:起名字的规矩
标识符就是你给变量、函数、类起的名字。Kotlin的命名规则很简单:
- 只能包含字母、数字、下划线(
_) - 不能以数字开头
- 不能是关键字(比如
if、else、class等)
关键字就是语言保留的词,有特殊含义。比如 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用函数代替了符号:and、or、xor、inv、shl、shr、ushr。
val flags = 0b1010
val mask = 0b1100
val result = flags and mask // 结果是0b1000
++ 和 -- 运算符。想自增?用 += 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时再给用户提示——安全多了。
知识体系总览
下面这张图帮你理清本章的知识结构。别小看它,每次学完一章,回头看看这张图,能帮你把零散的知识点串起来。
好了,这一章的内容就到这里。记住,基础概念虽然简单,但它们是构建复杂程序的砖瓦。我建议你每学完一个知识点,都打开IDE敲一遍代码——光看是记不住的。下一章我们会进入更“好玩”的部分:控制流和函数。到时候见。