Kotlin 类和对象
- 面向对象编程特性:Kotlin 支持面向对象编程风格,允许通过创建对象解决复杂问题,涉及对象的状态和行为。
- 定义 Kotlin 类:使用
class
关键字定义类,其中包括属性(状态)和成员函数(行为)。类相当于对象的蓝图。 - 创建和使用对象:在定义类后,可通过类名和构造函数创建对象,并使用
.
符号访问其成员。例如,Lamp
类的对象可以执行开灯和关灯的操作。
Kotlin 支持函数式和面向对象编程。
Kotlin 支持诸如 高阶函数、函数类型 和 lambdas 等特性,这使其成为以函数式编程风格工作的绝佳选择。你将在后面的章节中学习这些概念。本文将重点介绍 Kotlin 中的面向对象编程风格。
面向对象编程(OOP)
在面向对象的编程风格中,你可以通过创建对象来将复杂问题划分为更小的集合。
这些对象共享两个特性:
- 状态
- 行为
让我们看几个例子:
-
Lamp
是一个对象 -
它可以处于
on
或off
状态。 -
你可以
打开
和关闭
灯(行为)。 -
Bicycle
是一个对象 -
它有
当前档位
、两个轮子
、档位数量
等状态。 -
它有
刹车
、加速
、变档
等行为。
在接下来的学习中,你将了解面向对象编程的详细特性,如:数据封装、继承 和 多态性。本文将专注于基础知识,以保持简单。
推荐阅读: 什么是对象?
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 可见性修饰符 文章中了解到 protected
和 internal
修饰符。
如果你不指定可见性修饰符,默认将是 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
类的两个对象 l1
和 l2
。两个灯 l1
和 l2
的 isOn
属性将是 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
类的两个对象l1
和l2
。 - 这里,使用
l1
对象调用了turnOn()
函数:l1.turnOn()
。这个方法将l1
对象的isOn
实例变量设置为true
。 - 同时,使用
l2
对象调用了turnOff()
函数:l2.turnOff()
。这个方法将l2
对象的isOn
实例变量设置为false