Kotlin 类和对象

Kotlin 支持函数式编程和面向对象编程。

Kotlin 支持高阶函数函数类型lambda 等特性,使其成为函数式编程风格的绝佳选择。你将在后续章节中了解这些概念。本文将侧重于 Kotlin 中的面向对象编程风格。


面向对象编程 (OOP)

在面向对象编程风格中,你可以通过创建对象将复杂问题分解为更小的部分。

这些对象具有两个共同的特征

  • 状态
  • 行为

让我们举几个例子

  1. Lamp 是一个对象
    • 它可以处于 打开关闭 的状态。
    • 你可以打开关闭灯(行为)。
  2. Bicycle 是一个对象
    • 它具有 当前档位两个轮子档位数量 等状态。
    • 它具有 刹车加速换挡 等行为。

在接下来的学习中,你将了解到面向对象编程的详细特性,如:数据封装继承多态。本文将侧重于基础知识,以保持简单。

推荐阅读: 什么是对象?


Kotlin 类

在 Kotlin 中创建对象之前,你需要定义一个类。

类是对象的蓝图。

我们可以将类想象成房子的草图(原型)。它包含了关于地板、门、窗户等的所有细节。根据这些描述,我们建造房子。房子就是对象。

由于可以根据相同的描述建造许多房子,因此我们可以从一个类创建许多对象。


如何在 Kotlin 中定义类?

要在 Kotlin 中定义类,会使用 class 关键字。

class ClassName {
    // property
    // member function
    ... .. ...
}

下面是一个例子

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }
}

在这里,我们定义了一个名为 Lamp 的类。

该类有一个属性 isOn(定义方式与变量相同),以及两个成员函数 turnOn()turnOff()

推荐阅读: Kotlin 函数

在 Kotlin 中,属性必须被初始化,或者必须声明为 abstract访问: Kotlin 抽象类 了解更多)。在上面的例子中,isOn 属性被初始化为 false


类、对象、属性、成员函数等可以具有可见性修饰符。例如,isOn 属性是私有的。这意味着 isOn 属性只能在 Lamp 类内部更改。

其他可见性修饰符有

  • private - 仅在类内部可见(可访问)。
  • public - 在任何地方都可见。
  • protected - 对类及其子类可见。
  • internal - 模块内的任何客户端都可以访问它们。

你将在 Kotlin 可见性修饰符 文章中了解 protectedinternal 修饰符。

如果你不指定可见性修饰符,它将默认为 public

在上面的程序中,turnOn()turnOff() 成员函数是 public 的,而 isOn 属性是私有的。


Kotlin 对象

当类被定义时,只定义了对象的规范;没有分配内存或存储空间。

要访问类中定义的成员,你需要创建对象。让我们创建 Lamp 类的对象。

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }
}

fun main(args: Array<String>) {

    val l1 = Lamp() // create l1 object of Lamp class
    val l2 = Lamp() // create l2 object of Lamp class
}

此程序创建了 Lamp 类的两个对象 l1l2。对于 l1l2 这两盏灯,isOn 属性都将是 false


如何访问成员?

你可以使用 . 符号访问类的属性和成员函数。例如,

l1.turnOn()

此语句调用 l1 对象的 turnOn() 函数。

让我们再举一个例子

l2.isOn = true

在这里,我们尝试将 true 赋值给 l2 对象的 isOn 属性。请注意,isOn 属性是 private 的,如果你尝试从类外部访问 isOn,将会抛出异常。


示例:Kotlin 类与对象

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }

    fun displayLightStatus(lamp: String) {
        if (isOn == true)
            println("$lamp lamp is on.")
        else
            println("$lamp lamp is off.")
    }
}

fun main(args: Array<String>) {

    val l1 = Lamp() // create l1 object of Lamp class
    val l2 = Lamp() // create l2 object of Lamp class

    l1.turnOn()
    l2.turnOff()

    l1.displayLightStatus("l1")
    l2.displayLightStatus("l2")
}

运行程序后,输出将是

l1 Lamp is on.
l2 Lamp is off.

在上面的程序中,

  • 创建了 Lamp 类。
  • 该类有一个属性 isOn 和三个成员函数 turnOn()turnOff()displayLightStatus()
  • main() 函数中创建了 Lamp 类的两个对象 l1l2
  • 在这里,使用 l1 对象调用 turnOn() 函数:l1.turnOn()。此方法将 l1 对象的 isOn 实例变量设置为 true
  • 然后,使用 l2 对象调用 turnOff() 函数:l1.turnOff()。此方法将 l2 对象的 isOff 实例变量设置为 false
  • 然后,为 l1l2 对象调用 displayLightStatus() 函数,该函数会根据 isOn 属性是 true 还是 false 打印相应的消息。

请注意,isOn 属性在类内部初始化为 false。当创建类的对象时,该对象的 isOn 属性会自动初始化为 false。因此,l2 对象不必调用 turnOff() 来将 isOn 属性设置为 false

例如

class Lamp {

    // property (data member)
    private var isOn: Boolean = false

    // member function
    fun turnOn() {
        isOn = true
    }

    // member function
    fun turnOff() {
        isOn = false
    }

    fun displayLightStatus() {
        if (isOn == true)
            println("lamp is on.")
        else
            println("lamp is off.")
    }
}

fun main(args: Array<String>) {

    val lamp = Lamp()
    lamp.displayLightStatus()
}

运行程序后,输出将是

lamp is off.

本文只是 Kotlin 面向对象编程的介绍。请按顺序查看以下章节以了解更多信息

  • Kotlin 构造函数和初始化块
  • Kotlin this 关键字
  • Kotlin 嵌套类
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战