Kotlin 是一种现代化的编程语言,由 JetBrains 开发,现已成为 Android 官方支持的开发语言。相比于 Java,Kotlin 提供了更简洁、安全和高效的语法特性,极大地提升了开发效率。本章节将深入讲解 Kotlin 的基础语法和核心特性,帮助学员掌握 Kotlin 在 Android 开发中的应用。
2.1 Kotlin 简介
-
Kotlin 的历史与发展:
- Kotlin 由 JetBrains 于 2011 年首次发布,2017 年被 Google 宣布为 Android 官方开发语言。
- Kotlin 1.0 于 2016 年发布,目前最新版本为 Kotlin 1.8.x。
- Kotlin 不仅可以用于 Android 开发,还支持服务器端开发、Web 开发等。
-
Kotlin 的优势:
- 简洁性: 相比 Java,Kotlin 代码更简洁,减少样板代码。
- 安全性: 内置空安全机制,避免空指针异常。
- 互操作性: Kotlin 与 Java 完全兼容,可以无缝调用 Java 代码。
- 函数式编程支持: 支持高阶函数、Lambda 表达式等函数式编程特性。
- 扩展函数: 可以为现有类添加新功能,而无需继承。
2.2 Kotlin 基本语法
2.2.1 数据类型与变量声明
-
基本数据类型:
Int
: 32 位有符号整数,例如val age: Int = 25
Double
: 64 位浮点数,例如val price: Double = 19.99
Boolean
: 布尔类型,true
或false
,例如val isStudent: Boolean = false
Char
: 单个字符,例如val grade: Char = 'A'
String
: 字符串,例如val name: String = "Alice"
-
变量声明:
val
(不可变变量):声明后不能重新赋值,类似于 Java 中的final
。val pi: Double = 3.14159
var
(可变变量):声明后可以重新赋值。var count: Int = 0 count = 5
2.2.2 控制流
-
if
表达式:- Kotlin 中的
if
是一个表达式,可以返回值。val max = if (a > b) a else b
- Kotlin 中的
-
when
表达式:when
类似于 Java 中的switch
,但功能更强大。when (x) { 1 -> println("One") 2 -> println("Two") else -> println("Other") }
-
for
循环:- 使用
for
循环遍历集合或范围。for (i in 1..5) { println(i) }
- 使用
-
while
和do-while
循环:- 与 Java 中的用法类似。
var i = 0 while (i < 5) { println(i) i++ } do { println(i) i++ } while (i < 5)
- 与 Java 中的用法类似。
2.2.3 函数
-
函数声明:
- 使用
fun
关键字声明函数。fun greet(name: String): String { return "Hello, $name!" }
- 使用
-
单表达式函数:
- 当函数只有一个表达式时,可以省略大括号和
return
关键字。fun add(a: Int, b: Int) = a + b
- 当函数只有一个表达式时,可以省略大括号和
-
默认参数和命名参数:
- 函数参数可以有默认值,调用时可以省略参数。
fun build(title: String, width: Int = 800, height: Int = 600) { // 函数体 } build("My Window", 1024) // width=1024, height=600 build(title = "My Window", height = 768) // width=800, height=768
- 函数参数可以有默认值,调用时可以省略参数。
2.3 Kotlin 面向对象编程
2.3.1 类与对象
-
类声明:
- 使用
class
关键字声明类。class Person(val name: String, var age: Int)
- 使用
-
对象创建:
- 使用
val
或var
声明对象。val person = Person("Alice", 25)
- 使用
2.3.2 继承与多态
-
继承:
- Kotlin 中的类默认是不可继承的,需要使用
open
关键字。open class Animal(val name: String) class Dog(name: String) : Animal(name)
- Kotlin 中的类默认是不可继承的,需要使用
-
方法重写:
- 使用
override
关键字重写父类方法。open class Animal(val name: String) { open fun makeSound() { println("Some sound") } } class Dog(name: String) : Animal(name) { override fun makeSound() { println("Woof") } }
- 使用
2.3.3 接口与抽象类
-
接口:
- 使用
interface
关键字声明接口。interface Drivable { fun drive() } class Car : Drivable { override fun drive() { println("Driving a car") } }
- 使用
-
抽象类:
- 使用
abstract
关键字声明抽象类和方法。abstract class Shape { abstract fun area(): Double } class Circle(val radius: Double) : Shape() { override fun area() = Math.PI * radius * radius }
- 使用
2.4 Kotlin 高级特性
2.4.1 Lambda 表达式与高阶函数
-
Lambda 表达式:
- 匿名函数,可以作为参数传递给高阶函数。
val sum = { a: Int, b: Int -> a + b } println(sum(2, 3)) // 输出 5
- 匿名函数,可以作为参数传递给高阶函数。
-
高阶函数:
- 接受函数作为参数或返回函数的函数。
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } val result = operate(5, 3) { a, b -> a * b } println(result) // 输出 15
- 接受函数作为参数或返回函数的函数。
2.4.2 扩展函数
- 扩展函数:
- 为现有类添加新功能,而无需继承。
fun String.isPalindrome(): Boolean { return this.reversed() == this } println("madam".isPalindrome()) // 输出 true
- 为现有类添加新功能,而无需继承。
2.4.3 数据类与解构声明
-
数据类:
- 使用
data
关键字声明数据类,自动生成equals()
,hashCode()
,toString()
等方法。data class User(val name: String, val age: Int) val user = User("Alice", 25) println(user) // 输出 User(name=Alice, age=25)
- 使用
-
解构声明:
- 可以将数据类对象解构为多个变量。
val (name, age) = user println("$name is $age years old") // 输出 Alice is 25 years old
- 可以将数据类对象解构为多个变量。
2.4.4 空安全机制
-
可空类型:
- 使用
?
标记可空类型。var name: String? = "Alice" name = null
- 使用
-
安全调用操作符:
- 使用
?.
进行安全调用,避免空指针异常。println(name?.length) // 如果 name 不为 null,则输出 length,否则输出 null
- 使用
-
Elvis 操作符:
- 使用
?:
提供默认值。val length = name?.length ?: 0
- 使用
-
非空断言操作符:
- 使用
!!
强制解包可空类型,如果为 null 则抛出异常。println(name!!.length) // 如果 name 为 null,则抛出 NullPointerException
- 使用
通过本章节的学习,学员将能够掌握 Kotlin 的基本语法和高级特性,理解 Kotlin 在 Android 开发中的应用,为后续的 Android 应用开发做好充分准备。
作者简介
前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!
温馨提示:可搜老码小张公号联系导师