跳到主要内容

Kotlin 类和对象

提示
  1. 面向对象编程特性:Kotlin 支持面向对象编程风格,允许通过创建对象解决复杂问题,涉及对象的状态和行为。
  2. 定义 Kotlin 类:使用 class 关键字定义类,其中包括属性(状态)和成员函数(行为)。类相当于对象的蓝图。
  3. 创建和使用对象:在定义类后,可通过类名和构造函数创建对象,并使用 . 符号访问其成员。例如,Lamp 类的对象可以执行开灯和关灯的操作。

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

Kotlin 支持诸如 高阶函数函数类型lambdas 等特性,这使其成为以函数式编程风格工作的绝佳选择。你将在后面的章节中学习这些概念。本文将重点介绍 Kotlin 中的面向对象编程风格。

面向对象编程(OOP)

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

这些对象共享两个特性:

  • 状态
  • 行为

让我们看几个例子:

  1. Lamp 是一个对象

  2. 它可以处于 onoff 状态。

  3. 你可以 打开关闭 灯(行为)。

  4. Bicycle 是一个对象

  5. 它有 当前档位两个轮子档位数量 等状态。

  6. 它有 刹车加速变档 等行为。

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

推荐阅读: 什么是对象?

Kotlin 类

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

类是对象的蓝图。

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

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

如何在 Kotlin 中定义类?

在 Kotlin 中,使用 class 关键字来定义类:

class ClassName {
// 属性
// 成员函数
... .. ...
}

这是一个例子:

class Lamp {

// 属性(数据成员)
private var isOn: Boolean = false

// 成员函数
fun turnOn() {
isOn = true
}

// 成员函数
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 {

// 属性(数据成员)
private var isOn: Boolean = false

// 成员函数
fun turnOn() {
isOn = true
}

// 成员函数
fun turnOff() {
isOn = false
}
}

fun main(args: Array<String>) {

val l1 = Lamp() // 创建 Lamp 类的 l1 对象
val l2 = Lamp() // 创建 Lamp 类的 l2 对象
}

这个程序创建了 Lamp 类的两个对象 l1l2。两个灯 l1l2isOn 属性将是 false

如何访问成员?

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

l1.turnOn()

这条语句为 l1 对象调用了 turnOn() 函数。

让我们看另一个例子:

l2.isOn = true

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

示例:Kotlin 类和对象

class Lamp {

// 属性(数据成员)
private var isOn: Boolean = false

// 成员函数
fun turnOn() {
isOn = true
}

// 成员函数
fun turnOff() {
isOn = false
}

fun displayLightStatus(lamp: String) {
if (isOn == true)
println("$lamp 灯是开的。")
else
println("$lamp 灯是关的。")
}
}

fun main(args: Array<String>) {

val l1 = Lamp() // 创建 Lamp 类的 l1 对象
val l2 = Lamp() // 创建 Lamp 类的 l2 对象

l1.turnOn()
l2.turnOff()

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

当你运行程序时,输出将是:

l1 灯是开的。
l2 灯是关的。

在上述程序中,

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

注意,类中的 isOn 属性被初始化为 false。当创建类的对象时,对象的 isOn 属性会自动初始化为 false。因此,对于 l2 对象来说,没有必要调用 turnOff() 来将 isOn 属性设置为 false

例如:

class Lamp {

// 属性(数据成员)
private var isOn: Boolean = false

// 成员函数
fun turnOn() {
isOn = true
}

// 成员函数
fun turnOff() {
isOn = false
}

fun displayLightStatus() {
if (isOn == true)
println("灯是开的。")
else
println("灯是关的。")
}
}

fun main(args: Array<String>) {

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

当你运行程序时,输出将是:

灯是关的。

这篇文章只是对 Kotlin 面向对象编程的简介。查看以下章节以了解更多内容:

  • Kotlin 构造函数和初始化器
  • Kotlin this 关键字
  • Kotlin 嵌套类