尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Kotlin 类和对象:从基础语法到实战应用

Kotlin 类和对象:从基础语法到实战应用 1. 引言Kotlin 作为现代 JVM 语言凭借其简洁、安全和互操作性强的特点已成为 Android 开发的首选语言。类和对象是面向对象编程的核心Kotlin 在传统面向对象的基础上进行了大量创新让代码更加简洁高效。本文将带你系统学习 Kotlin 类和对象的核心概念并通过丰富的代码实例帮助你快速掌握。2. 类的定义与基本语法在 Kotlin 中使用class关键字定义类。与 Java 不同Kotlin 的类声明更加简洁构造函数直接写在类名后面。// 定义一个简单的 Person 类 class Person { var name: String var age: Int 0 fun speak() { println($name 正在说话) } } // 使用类 fun main() { val person Person() person.name 张三 person.age 25 person.speak() }Kotlin 中类的默认可见性是public类默认是final的不可被继承除非使用open关键字标记。3. 构造函数Kotlin 的构造函数分为主构造函数和次构造函数。主构造函数直接在类名后声明是类头的一部分。3.1 主构造函数// 主构造函数直接在类名后声明参数 class User(val username: String, val password: String) { // 类体中可以定义属性和方法 fun showInfo() { println(用户名$username) } } fun main() { val user User(admin, 123456) user.showInfo() }3.2 带默认参数的主构造函数// 构造函数参数可以设置默认值 class Product( val name: String, val price: Double 0.0, val stock: Int 0 ) { fun display() { println(商品$name价格$price库存$stock) } } fun main() { val product1 Product(手机, 2999.0, 100) val product2 Product(耳机) // 使用默认参数 product1.display() product2.display() }3.3 次构造函数class Student { var name: String var grade: Int // 主构造函数 constructor(name: String) { this.name name this.grade 1 } // 次构造函数通过 this 调用另一个构造函数 constructor(name: String, grade: Int) : this(name) { this.grade grade } fun info() { println(学生$name年级$grade) } } fun main() { val s1 Student(小明) val s2 Student(小红, 3) s1.info() s2.info() }4. 属性与字段Kotlin 的属性封装了字段和访问器。使用var声明可变属性使用val声明只读属性。4.1 属性的 getter 和 setterclass Circle { var radius: Double 0.0 get() field set(value) { if (value 0) { field value } else { println(半径不能为负数) } } // 计算属性没有 backing field val area: Double get() Math.PI * radius * radius } fun main() { val circle Circle() circle.radius 5.0 println(面积${circle.area}) circle.radius -1.0 // 触发 setter 校验 }4.2 延迟初始化属性class DatabaseManager { // lateinit 用于延迟初始化适用于 var 属性 lateinit var connection: String // lazy 用于惰性初始化适用于 val 属性 val config: String by lazy { println(初始化配置...) 数据库配置信息 } fun connect() { connection 已建立连接 println(connection) } } fun main() { val db DatabaseManager() db.connect() println(db.config) // 第一次访问时初始化 println(db.config) // 后续访问直接返回缓存值 }5. 继承与多态Kotlin 使用冒号:表示继承关系父类需要使用open关键字标记子类覆盖父类方法时需要使用override关键字。// 父类使用 open 标记可被继承 open class Animal(val name: String) { // open 方法可被覆盖 open fun makeSound() { println($name 发出声音) } } // 子类继承父类 class Dog(name: String) : Animal(name) { override fun makeSound() { println($name 汪汪叫) } } class Cat(name: String) : Animal(name) { override fun makeSound() { println($name 喵喵叫) } } fun main() { val animals: ListAnimal listOf(Dog(旺财), Cat(咪咪)) // 多态调用同一个方法表现不同行为 for (animal in animals) { animal.makeSound() } }6. 抽象类与接口6.1 抽象类// 抽象类包含抽象方法和具体方法 abstract class Shape { abstract fun area(): Double // 具体方法 fun describe() { println(这是一个形状面积为 ${area()}) } } class Rectangle(val width: Double, val height: Double) : Shape() { override fun area(): Double width * height } class Triangle(val base: Double, val height: Double) : Shape() { override fun area(): Double 0.5 * base * height } fun main() { val shapes listOf(Rectangle(4.0, 5.0), Triangle(3.0, 6.0)) for (shape in shapes) { shape.describe() } }6.2 接口// 定义接口 interface Flyable { fun fly() // 接口可以有默认实现 fun takeOff() { println(准备起飞...) fly() } } interface Swimmable { fun swim() } // 一个类可以实现多个接口 class Duck : Flyable, Swimmable { override fun fly() { println(鸭子飞起来了) } override fun swim() { println(鸭子在游泳) } } fun main() { val duck Duck() duck.takeOff() duck.swim() }7. 数据类数据类使用data关键字声明自动生成equals()、hashCode()、toString()、copy()等方法非常适合用于数据模型。// 数据类声明 data class UserInfo( val id: Int, val name: String, val email: String ) fun main() { val user1 UserInfo(1, 张三, zhangsanexample.com) val user2 UserInfo(1, 张三, zhangsanexample.com) // 自动生成的 toString() println(user1) // 自动生成的 equals() println(user1 user2${user1 user2}) // copy() 方法复制并修改部分属性 val user3 user1.copy(email newemailexample.com) println(user3) // 解构声明 val (id, name, email) user1 println(解构$id, $name, $email) }8. 伴生对象与单例8.1 伴生对象伴生对象使用companion object声明相当于 Java 中的静态成员属于类本身而非实例。class ConfigManager { companion object { const val VERSION 1.0.0 fun getConfig(): String { return 配置信息 } } } fun main() { // 直接通过类名访问 println(版本号${ConfigManager.VERSION}) println(ConfigManager.getConfig()) }8.2 单例对象// 使用 object 声明单例 object Database { private var connectionCount 0 fun connect() { connectionCount println(建立连接当前连接数$connectionCount) } fun disconnect() { connectionCount-- println(断开连接当前连接数$connectionCount) } } fun main() { // 全局唯一实例 Database.connect() Database.connect() Database.disconnect() }9. 密封类密封类使用sealed关键字声明用于表示受限的类层次结构所有子类必须定义在同一个文件或同一个包中。// 密封类定义 sealed class Result { data class Success(val data: String) : Result() data class Error(val message: String) : Result() object Loading : Result() } // 使用 when 表达式处理密封类 fun handleResult(result: Result) { when (result) { is Result.Success - println(成功${result.data}) is Result.Error - println(失败${result.message}) Result.Loading - println(加载中...) } } fun main() { handleResult(Result.Success(数据加载完成)) handleResult(Result.Error(网络超时)) handleResult(Result.Loading) }10. 扩展函数与扩展属性Kotlin 允许在不修改原类的情况下为类添加新功能这就是扩展函数和扩展属性。// 为 String 类添加扩展函数 fun String.isEmail(): Boolean { return this.contains() this.contains(.) } // 为 List 类添加扩展函数 fun T ListT.secondOrNull(): T? { return if (this.size 2) this[1] else null } // 扩展属性 val String.isLong: Boolean get() this.length 10 fun main() { val email testexample.com println($email 是邮箱${email.isEmail()}) val list listOf(A, B, C) println(第二个元素${list.secondOrNull()}) val shortText Hello println($shortText 是长文本${shortText.isLong}) }11. 实战案例员工管理系统综合运用以上知识实现一个简单的员工管理系统。// 员工抽象类 abstract class Employee( val id: Int, val name: String ) { abstract fun calculateSalary(): Double fun displayInfo() { println(工号$id姓名$name薪资${calculateSalary()}) } } // 全职员工 class FullTimeEmployee( id: Int, name: String, val monthlySalary: Double ) : Employee(id, name) { override fun calculateSalary(): Double monthlySalary } // 兼职员工 class PartTimeEmployee( id: Int, name: String, val hourlyRate: Double, val hoursWorked: Double ) : Employee(id, name) { override fun calculateSalary(): Double hourlyRate * hoursWorked } // 员工管理类 class EmployeeManager { private val employees mutableListOfEmployee() fun addEmployee(employee: Employee) { employees.add(employee) println(添加员工${employee.name}) } fun showAllEmployees() { println( 员工列表 ) for (employee in employees) { employee.displayInfo() } } fun getTotalSalary(): Double { return employees.sumOf { it.calculateSalary() } } } fun main() { val manager EmployeeManager() manager.addEmployee(FullTimeEmployee(1, 张三, 8000.0)) manager.addEmployee(FullTimeEmployee(2, 李四, 10000.0)) manager.addEmployee(PartTimeEmployee(3, 王五, 50.0, 80.0)) manager.showAllEmployees() println(总薪资支出${manager.getTotalSalary()}) }12. 总结本文系统介绍了 Kotlin 类和对象的核心知识包括类的定义、构造函数、属性、继承、抽象类、接口、数据类、伴生对象、密封类以及扩展函数等。Kotlin 在面向对象设计上做了大量优化让代码更加简洁、安全和易维护。建议读者结合实战项目多加练习逐步掌握这些特性的使用场景写出高质量的 Kotlin 代码。
返回列表