一、类与对象:从蓝图到实例
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 = 26println("修改后年龄: ${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: Intfun 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/hcar.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) // 输出: trueprintln(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面向对象编程的核心概念。
最后建议大家通过以下方式巩固:
尝试实现一个简单的银行账户系统
创建包含继承关系的动物类层次
使用数据类处理用户信息
实现一个状态机(使用密封类)