一、类与对象:从蓝图到实例
Kotlin的类定义简洁高效,支持属性自动生成getter/setter。以下是一个完整的Person类示例:
// 定义Person类
class Person(val name: String, var age: Int) {
// 成员方法
fun introduce() {
println("姓名: $name, 年龄: $age")
}
// 私有方法示例
private fun validateAge() {
require(age >= 0) { "年龄不能为负数" }
}
}
// 对象实例化
fun main() {
val person = Person("张三", 25)
person.introduce() // 输出: 姓名: 张三, 年龄: 25
// 修改可变属性
person.age = 26
println("修改后年龄: ${person.age}") // 输出: 修改后年龄: 26
}
关键点:
val定义不可变属性,var定义可变属性
构造函数参数可直接声明为属性
私有方法通过private修饰符实现封装
二、继承体系:构建类层次结构
Kotlin默认所有类不可继承,需使用open标记。以下是完整的继承示例:
// 基类定义
open class Animal(val name: String) {
open fun makeSound() {
println("$name 发出声音")
}
}
// 子类继承
class Dog(name: String, val breed: String) : Animal(name) {
override fun makeSound() {
println("$name ($breed): 汪汪!")
}
// 新增方法
fun fetch() {
println("$name 正在捡球")
}
}
// 测试继承
fun main() {
val dog = Dog("旺财", "金毛")
dog.makeSound() // 输出: 旺财 (金毛): 汪汪!
dog.fetch() // 输出: 旺财 正在捡球
}
关键点:
基类需用open标记
子类通过:继承
方法重写需用override
子类可扩展新方法
三、接口实现:多态的核心机制
Kotlin接口支持默认实现,以下是完整示例:
// 定义接口
interface Vehicle {
val maxSpeed: Int
fun start()
fun stop() {
println("车辆已停止")
}
}
// 实现接口
class Car(override val maxSpeed: Int) : Vehicle {
override fun start() {
println("汽车启动,最高时速: $maxSpeed km/h")
}
}
// 使用接口
fun main() {
val car = Car(180)
car.start() // 输出: 汽车启动,最高时速: 180 km/h
car.stop() // 输出: 车辆已停止
}
关键点:
接口属性用val声明
默认方法直接在接口中实现
实现类必须重写抽象方法
四、数据类:简化数据模型
Kotlin的数据类自动生成常用方法,以下是示例:
// 定义数据类
data class Product(val id: Int, val name: String, val price: Double)
// 测试数据类
fun main() {
val p1 = Product(1, "手机", 2999.0)
val p2 = Product(1, "手机", 2999.0)
println(p1) // 输出: Product(id=1, name=手机, price=2999.0)
println(p1 == p2) // 输出: true
println(p1.copy(price = 2599.0)) // 输出: Product(id=1, name=手机, price=2599.0)
}
关键点:
data关键字自动生成:
equals()/hashCode()
toString()
copy()方法
五、扩展函数:增强现有类
无需继承即可扩展功能,以下是示例:
// 扩展String类
fun String.addExclamation(): String {
return this + "!"
}
// 测试扩展函数
fun main() {
val greeting = "Hello"
println(greeting.addExclamation()) // 输出: Hello!
}
关键点:
扩展函数定义在类外部
通过receiver访问原类成员
保持原有类型安全
六、密封类:受限的类层次
密封类限制子类范围,以下是示例:
// 定义密封类
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
}
// 处理密封类
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("成功: ${result.data}")
is Result.Error -> println("错误: ${result.message}")
}
}
// 测试密封类
fun main() {
handleResult(Result.Success("操作完成")) // 输出: 成功: 操作完成
handleResult(Result.Error("网络错误")) // 输出: 错误: 网络错误
}
关键点:
密封类子类必须定义在同文件
when表达式可穷举所有子类
无需else分支
七、最佳实践建议
属性设计:优先使用不可变属性(val)
继承控制:默认使用final类,仅在必要时使用open
接口设计:合理使用默认方法减少重复代码
空安全:利用?和!!明确空值处理
扩展函数:优先使用扩展而非继承
通过以上示例,大家可以学习到Kotlin面向对象编程的核心概念。
最后建议大家通过以下方式巩固:
尝试实现一个简单的银行账户系统
创建包含继承关系的动物类层次
使用数据类处理用户信息
实现一个状态机(使用密封类)