Kotlin 支持函数式编程和面向对象编程。
Kotlin 支持高阶函数、函数类型和lambda 等特性,使其成为函数式编程风格的绝佳选择。你将在后续章节中了解这些概念。本文将侧重于 Kotlin 中的面向对象编程风格。
面向对象编程 (OOP)
在面向对象编程风格中,你可以通过创建对象将复杂问题分解为更小的部分。
这些对象具有两个共同的特征
- 状态
- 行为
让我们举几个例子
- Lamp 是一个对象
- 它可以处于 打开 或 关闭 的状态。
- 你可以
打开
和关闭
灯(行为)。
- 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 可见性修饰符 文章中了解 protected
和 internal
修饰符。
如果你不指定可见性修饰符,它将默认为 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 类的两个对象 l1 和 l2。对于 l1 和 l2 这两盏灯,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 类的两个对象 l1 和 l2。 - 在这里,使用 l1 对象调用
turnOn()
函数:l1.turnOn()
。此方法将 l1 对象的 isOn 实例变量设置为true
。 - 然后,使用 l2 对象调用
turnOff()
函数:l1.turnOff()
。此方法将 l2 对象的 isOff 实例变量设置为false
。 - 然后,为 l1 和 l2 对象调用
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 嵌套类