Kotlin 类的关键字
最后修改于 2025 年 4 月 19 日
Kotlin 的 class 关键字是 Kotlin 中面向对象编程的基础。类是创建封装数据和行为的对象的蓝图。本教程通过实际例子深入探讨了 class 关键字。
基本定义
Kotlin 中的 class 关键字声明一个类,它是创建对象的模板。一个类可以包含属性(数据)和函数(行为)。Kotlin 类支持继承、接口和其他 OOP 特性。
简单类声明
Kotlin 中最基本的类是用 class 关键字后跟类名声明的。即使是空类也可用作标记或在泛型编程中使用。
package com.zetcode
class Person
fun main() {
val person = Person()
println(person) // Output: com.zetcode.Person@<hashcode>
}
在这里,我们声明一个最小的 Person 类,它没有任何属性或方法。我们使用默认构造函数创建一个实例。输出显示类名和对象引用。
具有属性的类
Kotlin 类可以在主构造函数中声明属性。这些属性可以是可变的 (var) 或只读的 (val)。
package com.zetcode
class Person(val name: String, var age: Int)
fun main() {
val person = Person("John Doe", 30)
println("${person.name} is ${person.age} years old")
person.age = 31 // Can modify var property
// person.name = "Jane" // Error: val cannot be reassigned
}
这个 Person 类在其主构造函数中声明了两个属性。name 是只读的,而 age 是可变的。我们演示了访问和修改这些属性。
具有方法的类
类可以包含定义其行为的成员函数(方法)。这些函数可以访问类的属性并可以修改对象的状态。
package com.zetcode
class Counter {
var count = 0
fun increment() {
count++
}
fun reset() {
count = 0
}
}
fun main() {
val counter = Counter()
counter.increment()
counter.increment()
println(counter.count) // Output: 2
counter.reset()
println(counter.count) // Output: 0
}
Counter 类通过 count 属性维护状态,并提供修改它的方法。increment 增加计数,而 reset 将其重置为零。
使用开放类的继承
Kotlin 类默认是 final 的。要允许继承,请使用 open 关键字标记该类。子类使用 : 后跟父构造函数调用。
package com.zetcode
open class Animal(val name: String) {
open fun makeSound() {
println("$name makes a sound")
}
}
class Dog(name: String) : Animal(name) {
override fun makeSound() {
println("$name barks")
}
}
fun main() {
val animal = Animal("Generic Animal")
animal.makeSound() // Output: Generic Animal makes a sound
val dog = Dog("Rex")
dog.makeSound() // Output: Rex barks
}
这里,Animal 被标记为 open 以允许继承。Dog 扩展了 Animal 并覆盖了它的 makeSound 方法。重写关键字是方法重写所必需的。
数据类
数据类是创建持有数据的类的简明方式。data 修饰符会自动生成有用的方法,例如 toString、equals 和 copy。
package com.zetcode
data class User(val id: Int, val name: String, val email: String)
fun main() {
val user1 = User(1, "Alice", "alice@example.com")
val user2 = User(1, "Alice", "alice@example.com")
println(user1) // Output: User(id=1, name=Alice, email=alice@example.com)
println(user1 == user2) // Output: true
val user3 = user1.copy(id = 2)
println(user3) // Output: User(id=2, name=Alice, email=alice@example.com)
}
User 数据类会自动实现有用的方法。我们演示了相等比较和通过修改进行复制。数据类是为简单数据结构建模的理想选择。
伴生对象
Kotlin 类可以有伴生对象,其作用类似于其他语言中的静态成员。它们使用类内的 companion object 关键字声明。
package com.zetcode
class MathUtils {
companion object {
fun square(number: Int) = number * number
const val PI = 3.14159
}
}
fun main() {
println(MathUtils.square(5)) // Output: 25
println(MathUtils.PI) // Output: 3.14159
}
MathUtils 类包含一个伴生对象,该对象具有一个函数和一个常量。可以在类上直接访问这些成员,而无需实例。伴生对象可以实现接口并被命名。
密封类
密封类用于表示受限的类层次结构。所有子类必须在与密封类相同的文件中声明。它们对状态表示很有用。
package com.zetcode
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Success: ${result.data}")
is Result.Error -> println("Error: ${result.message}")
Result.Loading -> println("Loading...")
}
}
fun main() {
handleResult(Result.Success("Data loaded"))
handleResult(Result.Error("Network failure"))
handleResult(Result.Loading)
}
Result 密封类具有三种可能的状态。when 表达式可以详尽地检查所有情况,而无需 else 分支。密封类提供了一种类型安全的方式来处理不同的状态。
Kotlin 类的最佳实践
- 优先使用不变性: 除非需要修改,否则使用
val属性。 - 使用数据类: 对于简单的数据持有者,数据类减少了样板代码。
- 保持类的专注: 遵循单一职责原则以实现可维护的代码。
- 考虑密封类: 对于受限的层次结构,密封类提供类型安全。
- 使用伴生对象: 对于工厂方法或常量,伴生对象是惯用的。
来源
本教程深入介绍了 Kotlin 的 class 关键字,展示了各种类类型和特性。我们探讨了简单类、继承、数据类、伴生对象和密封类。正确使用类是编写干净、可维护的 Kotlin 代码的基础。
作者
列出 所有 Kotlin 教程。