Kotlin面向对象编程实战

发布于:2025-07-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、类与对象:从蓝图到实例

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面向对象编程的核心概念。

最后建议大家通过以下方式巩固:
尝试实现一个简单的银行账户系统
创建包含继承关系的动物类层次
使用数据类处理用户信息
实现一个状态机(使用密封类)


网站公告

今日签到

点亮在社区的每一天
去签到