3. Kotlin语言基础(上):Kotlin简介与优势、变量与常量、基本数据类型、条件控制(if、when)、循环控制(for、while)
各位同学,欢迎来到Kotlin的世界。说实话,我刚开始接触Android开发时,用的还是Java。那时候写一个简单的Activity,光getter/setter就能写到手软。后来Google宣布Kotlin成为官方语言,我一开始还挺抗拒的——毕竟Java用了那么多年,凭什么要换?
但当我真正花了一周时间把Kotlin用起来之后,嗯,真香。代码量直接砍半,空指针异常也少了很多。今天我们就从最基础的部分开始,把Kotlin的底子打扎实。
3.1 Kotlin简介与优势
Kotlin是JetBrains公司开发的一门静态类型编程语言,2017年被Google正式列为Android开发官方语言。它完全兼容Java,但比Java更简洁、更安全。
我个人觉得,Kotlin最大的优势就三个字:少写代码。你想想看,同样的功能,Java可能要写50行,Kotlin可能20行就搞定了。而且Kotlin天然支持空安全,很多运行时崩溃在编译阶段就被扼杀了。
Kotlin核心优势速览:
- 简洁:减少样板代码,比如不用写findViewById
- 安全:空指针异常(NullPointerException)几乎绝迹
- 互操作:可以和Java代码无缝混用
- 现代:支持函数式编程、协程等新特性
我在项目中遇到过好几次这样的情况:老项目用Java写的,新功能用Kotlin开发,两者在同一个工程里跑得稳稳的。这种平滑过渡的能力,说实话,是很多新语言做不到的。
3.2 变量与常量
Kotlin里声明变量有两种方式:var和val。简单来说,var是可变的,val是不可变的(只读)。
// 可变变量
var name: String = "张三"
name = "李四" // 没问题
// 不可变变量(常量)
val age: Int = 25
age = 30 // 编译报错!
我建议你养成一个习惯:能用val的地方,尽量别用var。为什么?因为不可变变量更安全,不容易被意外修改。我在早期写Kotlin时,图省事全用var,结果调试一个bug查了半天,最后发现是某个变量在别处被改了。从那以后,我默认都用val,只有确定需要修改时才用var。
类型推断:Kotlin可以根据初始值自动推断变量类型,所以很多时候可以省略类型声明。
val message = "Hello" // 自动推断为String
var count = 10 // 自动推断为Int
3.3 基本数据类型
Kotlin的基本数据类型和Java类似,但有一点不同:在Kotlin里,一切皆对象。也就是说,Int、Double这些类型也是对象,它们有方法、有属性。
| 类型 | 描述 | 示例 |
|---|---|---|
| Int | 整型(32位) | val a: Int = 100 |
| Long | 长整型(64位) | val b: Long = 100L |
| Float | 单精度浮点 | val c: Float = 3.14F |
| Double | 双精度浮点 | val d: Double = 3.14159 |
| Boolean | 布尔值 | val e: Boolean = true |
| Char | 单个字符 | val f: Char = 'A' |
| String | 字符串 | val g: String = "Hello" |
这里有个小细节:Kotlin的Int和Java的int不一样。Java的int是基本类型,不能为null;但Kotlin的Int默认也不能为null,除非你写成Int?。这个问号就是空安全的标志。
val nullableInt: Int? = null // 允许为null
val normalInt: Int = null // 编译报错
我曾经在接手一个老项目时,发现代码里到处都是!!操作符(强制非空断言),那基本就是Kotlin代码的坏味道。记住:能用?就别用!!。
3.4 条件控制:if 和 when
Kotlin的if和Java的if用法差不多,但有一个重要区别:Kotlin的if是表达式,不是语句。什么意思?就是if可以返回值。
// if作为表达式使用
val max = if (a > b) a else b
// 传统写法也可以
if (a > b) {
println("a更大")
} else {
println("b更大")
}
我个人非常喜欢这种写法,因为它让代码更紧凑。你想想看,在Java里你要写一个三目运算符a > b ? a : b,Kotlin直接用if就搞定了,而且可读性更好。
接下来是when,它是Java中switch的升级版。说实话,when比switch强大太多了。
val score = 85
val grade = when (score) {
in 90..100 -> "优秀"
in 80..89 -> "良好"
in 70..79 -> "中等"
in 60..69 -> "及格"
else -> "不及格"
}
println("成绩等级:$grade")
你看,when可以直接用in关键字判断范围,还能返回值。而且它不需要写break,不会像Java那样出现穿透问题。我在项目中经常用when来处理多种状态,比如网络请求的状态码、用户权限等级等,代码非常清晰。
注意:when的分支条件必须是完备的。如果可能的值没有被覆盖,必须提供else分支,否则编译会报错。
3.5 循环控制:for 和 while
Kotlin的for循环和Java差别挺大。Java里常见的for (int i = 0; i < 10; i++)这种写法,在Kotlin里被替换成了区间(Range)的概念。
// 遍历1到5
for (i in 1..5) {
println(i)
}
// 遍历1到4(不包含5)
for (i in 1 until 5) {
println(i)
}
// 倒序遍历
for (i in 5 downTo 1) {
println(i)
}
// 步长为2
for (i in 1..10 step 2) {
println(i)
}
我第一次看到这种写法时,觉得有点不习惯。但用了几次之后,发现它比Java的for循环更直观。你想想看,1..5就是1到5,downTo就是倒着来,语义非常清楚。
while循环和Java基本一样,没什么好说的。
var i = 0
while (i < 5) {
println(i)
i++
}
var j = 0
do {
println(j)
j++
} while (j < 5)
这里有个小技巧:在遍历集合时,Kotlin提供了withIndex()方法,可以同时拿到索引和值。
val list = listOf("苹果", "香蕉", "橘子")
for ((index, value) in list.withIndex()) {
println("第${index + 1}个是$value")
}
我在处理列表数据时经常用这个,比Java里单独维护一个计数器方便多了。
3.6 本章知识体系
为了让你更直观地理解本章的知识结构,我画了一张图。你可以看到,Kotlin基础部分从变量常量出发,延伸到数据类型,再到流程控制,环环相扣。
好了,这一章的内容就到这里。Kotlin的基础语法其实不难,关键是养成好的编码习惯。下一章我们会继续深入Kotlin的函数、集合和面向对象编程,到时候你会看到更多有意思的特性。