ZetCode

Kotlin 类的关键字

最后修改于 2025 年 4 月 19 日

Kotlin 的 class 关键字是 Kotlin 中面向对象编程的基础。类是创建封装数据和行为的对象的蓝图。本教程通过实际例子深入探讨了 class 关键字。

基本定义

Kotlin 中的 class 关键字声明一个类,它是创建对象的模板。一个类可以包含属性(数据)和函数(行为)。Kotlin 类支持继承、接口和其他 OOP 特性。

简单类声明

Kotlin 中最基本的类是用 class 关键字后跟类名声明的。即使是空类也可用作标记或在泛型编程中使用。

SimpleClass.kt
package com.zetcode

class Person

fun main() {

    val person = Person()
    println(person) // Output: com.zetcode.Person@<hashcode>
}

在这里,我们声明一个最小的 Person 类,它没有任何属性或方法。我们使用默认构造函数创建一个实例。输出显示类名和对象引用。

具有属性的类

Kotlin 类可以在主构造函数中声明属性。这些属性可以是可变的 (var) 或只读的 (val)。

ClassWithProperties.kt
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 是可变的。我们演示了访问和修改这些属性。

具有方法的类

类可以包含定义其行为的成员函数(方法)。这些函数可以访问类的属性并可以修改对象的状态。

ClassWithMethods.kt
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 关键字标记该类。子类使用 : 后跟父构造函数调用。

Inheritance.kt
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 修饰符会自动生成有用的方法,例如 toStringequalscopy

DataClass.kt
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 关键字声明。

CompanionObject.kt
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 类包含一个伴生对象,该对象具有一个函数和一个常量。可以在类上直接访问这些成员,而无需实例。伴生对象可以实现接口并被命名。

密封类

密封类用于表示受限的类层次结构。所有子类必须在与密封类相同的文件中声明。它们对状态表示很有用。

SealedClass.kt
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 类的最佳实践

来源

Kotlin 类文档

本教程深入介绍了 Kotlin 的 class 关键字,展示了各种类类型和特性。我们探讨了简单类、继承、数据类、伴生对象和密封类。正确使用类是编写干净、可维护的 Kotlin 代码的基础。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有多年的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1400 多篇文章和 8 本电子书。我有超过八年的编程教学经验。

列出 所有 Kotlin 教程