前言
根据官方教程,学习 Android 原生开发的第一步是了解 Kotlin 的基础语法,因此这里写一篇 Kotlin 学习笔记。
本文主要参考 Android 开发者官网提供的官方教程。如果时间充足,建议直接学习官方教程。本文是对其中基础语法的精简总结,更适合快速入门或者供“古法编程爱好者们”复习 Kotlin 语法时查阅。
本文默认你学过 C 或 C++ 中的至少一种,部分内容会以它们作为参考进行说明。当然这并非意味着我认为万物起源于 C/C++,我这么说只是为了方便大家理解,实际上每种语言都有其擅长和不擅长的领域。我们经常放在一起说的 C 和 C++,两者也有很大的区别,更别提其它编成语言了。
题外话,Kotlin 的读音接近“cot-lin”,用中文注音的话就是“科特林”。
话不多说,打开 Kotlin 园地,开始学习吧!
Hello World
先从经典的 Hello World 程序开始:
fun main() {
println("Hello, world!")
}
运行后会输出:
Hello, world!
和 C/C++ 中的输出函数类似,println() 会输出括号中的内容,并在末尾换行。
程序的入口
和 C/C++ 一样,可独立运行的 Kotlin 应用程序以 main() 函数作为入口,程序会从这里开始执行。具体写法可以参考上面的 Hello World 程序。
不过值得注意的是,Android 应用由系统启动,通常不需要开发者自己编写 main() 函数。
函数
定义并调用函数
Kotlin 中的函数和 C/C++ 类似,只是使用 fun 关键字,并将返回值类型写在形参列表后面:
fun functionName(parameterName: ParameterType): ReturnType {
// 函数体
return value
}
如果函数没有需要返回的结果,可以省略返回值类型,此时默认为 Unit。它和 C/C++ 中的 void 用途相近,也不需要写 return 语句。
函数调用方式和 C/C++ 基本相同:
fun main() {
sayHello()
}
fun sayHello() {
println("Hello!")
}
形参写法与只读特性
形参和实参的概念与 C/C++ 相同。不同的是,Kotlin 需要将形参写成 名称: 类型,而且形参是只读的,不能在函数体内重新赋值。它的工作方式类似于使用 val 声明的变量。
下面的函数接收 name 和 age 两个形参,并返回一个 String:
fun main() {
println(birthdayGreeting("Rover", 5))
println(birthdayGreeting("Rex", 2))
}
fun birthdayGreeting(name: String, age: Int): String {
val nameGreeting = "Happy Birthday, $name!"
val ageGreeting = "You are now $age years old!"
return "$nameGreeting\n$ageGreeting"
}
这里的 birthdayGreeting() 接收两个形参并返回一个 String,整体用法和 C/C++ 中的函数相近。
看懂函数签名
函数名称及其形参统称为“函数签名”,例如:
fun birthdayGreeting(name: String, age: Int)
了解这个术语即可,阅读代码和文档时经常会遇到。
使用具名实参
C/C++ 调用函数时,实参顺序要与形参列表保持一致。参数较多时,需要逐个确认它们的对应关系,有时比较麻烦。
Kotlin 可以使用“具名实参”,也就是在调用函数时写出形参名称。使用具名实参后,可以调整实参顺序,代码的含义也会更清楚:
println(birthdayGreeting(age = 2, name = "Rex"))
println(birthdayGreeting(name = "Rex", age = 2))
设置默认实参
Kotlin 可以直接为形参设置默认值。调用函数时没有传入对应的实参,就会使用这个默认值:
fun birthdayGreeting(name: String = "Rover", age: Int): String {
return "Happy Birthday, $name! You are now $age years old!"
}
当带有默认值的形参位于没有默认值的形参前面时,可以配合具名实参,只传入必需的实参:
println(birthdayGreeting(age = 5))
println(birthdayGreeting("Rex", 2))
函数的代码风格
下面是一些和函数有关的代码风格:
- 函数名称应采用驼峰命名法,并且应该是动词或动词短语。
- 每个语句都应单独占一行。
- 左花括号应出现在函数开始行的末尾。
- 左花括号前应有一个空格。
- 请勿使用制表符缩进代码,而应输入 4 个空格。
- 右花括号应在函数体最后一行代码之后单独占一行,并与函数开头的
fun关键字对齐。
这么做主要是为了提高代码的可读性,并在大型项目协作中保持一致。具体格式可以参考 Hello World 中的代码。
完整说明可以查看 Google 制定的 Android Kotlin 样式指南。
添加新的语句
按照 Kotlin 的代码风格,每个语句都应该单独占一行。 如果要新增语句,就在函数体中另起一行:
fun main() {
println("Hello, Android!")
println("Hello, Android!")
}
不使用分号时,不能把两个语句直接写在同一行:
fun main() {
println("Hello, Android!") println("Hello, Android!") // 编译错误
}
Kotlin 的分号是可选的。如果一定要把多个语句写在同一行,可以使用分号分隔,但官方代码风格建议尽量省略分号,并让每个语句单独占一行。
变量
Kotlin 变量的基本概念和 C/C++ 相同,主要区别在于声明方式、类型推断以及 val 和 var。
常见数据类型
下面是一些常见的 Kotlin 数据类型:
| Kotlin 数据类型 | 可包含的数据类型 | 字面量值示例 |
|---|---|---|
String |
文本 | "Add contact""Search""Sign in" |
Int |
整数 | 321293490-59281 |
Double |
小数 | 2.0501.0292-31723.99999 |
Float |
小数(不如 Double 精确),数字末尾带有 f 或 F |
5.0f-1630.209f1.2940278F |
Boolean |
true 或 false。当只有两个可能的值时,可使用此数据类型。true 和 false 是 Kotlin 中的关键字。 |
truefalse |
声明变量
Kotlin 使用 val 或 var 声明变量,类型写在变量名称后面:
val variableName: Type = initialValue
fun main() {
val count: Int = 2
// 输出 2
println(count)
}
val 用于声明只读变量,var 用于声明可以重新赋值的变量,具体区别见区分 val 与 var。
使用类型推断
Kotlin 支持类型推断。声明变量时如果提供了初始值,通常可以省略类型。因此,声明变量中的代码可以简写为:
val count = 2
如果没有提供初始值,就必须指定类型,并在使用变量前完成初始化:
val count: Int
count = 2
println(count)
在字符串中插入变量
fun main() {
val count: Int = 2
// 输出 You have 2 unread messages.
println("You have $count unread messages.")
}
Kotlin 支持字符串模板。使用 $变量名 可以直接将变量值插入字符串中。
如果要插入更复杂的表达式,就需要使用 ${表达式} 的形式。例如:
fun main() {
val unreadCount = 5
val readCount = 100
// 输出 You have 105 total messages in your inbox.
println("You have ${unreadCount + readCount} total messages in your inbox.")
}
区分 val 与 var
这是 Kotlin 与 C/C++ 差异比较明显的地方:
val用于声明只读变量,完成初始化后不能重新赋值。var用于声明可变变量,之后可以重新赋值。
fun main() {
var count = 2
count = 3
println(count)
}
需要注意,val 只保证变量不能指向另一个值,并不代表它引用的对象一定不可修改。
Kotlin 建议默认使用 val,只有确实需要重新赋值时才使用 var,以减少变量被意外修改的情况。
++ 与 -- 运算符
Kotlin 也支持 ++ 与 -- 运算符,但只能用于可以重新赋值的变量:
var count = 2
count++
count--
变量的代码风格
- 变量名称应采用驼峰命名法,并以小写字母开头。
- 在变量声明中指定数据类型时,应在冒号后面添加一个空格。
- 赋值运算符
=、加号+、减号-、乘号*、除号/等二元运算符的前后应有空格。 - 编写复杂程序时,建议每行不要超过 100 个字符,避免阅读代码时频繁水平滚动。
注释
Kotlin 的单行注释和多行注释写法与 C/C++ 相同:
// 注释 1
/* 注释 2
* 注释 3
* 注释 4
*/
Kotlin 的多行注释还可以嵌套,这一点与 C/C++ 不同:
/* 外层注释
/* 内层注释 */
*/
结语
不得不说,Android 官网提供的教程真是把读者当小朋友来教,看电子书竟然看出了上课的感觉。
我挺喜欢这种教学方式。初学者可以跟着教程慢慢学习,有基础的人也可以快速跳过说明,只看强调的重点。
官方教程最后提供的Kotlin 基础练习题也不错,难度适中,正好用来巩固理解。如果你是初学者,了解完 Kotlin 的基础语法后,建议做一下这些题目,加深对变量和函数的理解。