原文: https://www.programiz.com/kotlin-programming/class-objects

在本文中,将向您介绍 Kotlin 中的面向对象编程。 您将学习什么是类,如何创建对象并在程序中使用它。

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

Kotlin 支持诸如高阶函数函数类型lambda 之类的功能,这使其成为函数编程风格的理想选择。 您将在后面的章节中了解这些概念。 本文将重点介绍 Kotlin 中的面向对象的编程风格。


面向对象编程(OOP)

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

这些对象具有两个特征:

  • 状态
  • 行为

让我们举几个例子:

  1. Lamp是对象
    状态onoff
    行为turnOnturnOff
  2. Bicycle是对象
    状态currentGeartwoWheelsnumberOfGear
    行为brakingacceleratingchangingGears

您将继续学习面向对象编程的详细功能,例如:数据封装继承多态。 本文将重点介绍使事情保持简单的基础知识。

推荐阅读什么是对象?


Kotlin 类

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

类是对象的蓝图。

我们可以将类视为房子的草图(原型)。 它包含有关地板,门,窗户等的所有详细信息。基于这些描述,我们建造了房屋。 房子是对象。

由于可以用相同的描述制作许多房屋,因此我们可以根据一个类创建许多对象。


如何在 Kotlin 中定义一个类?

要在 Kotlin 中定义一个类,请使用class关键字:

  1. class ClassName {
  2. // property
  3. // member function
  4. ... .. ...
  5. }

这是一个例子:

  1. class Lamp {
  2. // property (data member)
  3. private var isOn: Boolean = false
  4. // member function
  5. fun turnOn() {
  6. isOn = true
  7. }
  8. // member function
  9. fun turnOff() {
  10. isOn = false
  11. }
  12. }

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

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

推荐阅读Kotlin 函数

在 Kotlin 中,必须初始化属性或将其声明为abstract访问Kotlin 抽象类,以了解更多信息)。 在上面的示例中,isOn属性被初始化为false


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

其他可见性修饰符是:

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

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

如果未指定可见性修饰符,则默认为public

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


Kotlin 对象

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

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

  1. class Lamp {
  2. // property (data member)
  3. private var isOn: Boolean = false
  4. // member function
  5. fun turnOn() {
  6. isOn = true
  7. }
  8. // member function
  9. fun turnOff() {
  10. isOn = false
  11. }
  12. }
  13. fun main(args: Array<String>) {
  14. val l1 = Lamp() // create l1 object of Lamp class
  15. val l2 = Lamp() // create l2 object of Lamp class
  16. }

该程序创建了Lamp类的两个对象l1l2。 两个灯l1l2on属性为false


如何访问成员?

您可以使用.表示法访问类的属性和成员函数。 例如,

  1. l1.turnOn()

该语句为l1对象调用turnOn()函数。

让我们再举一个例子:

  1. l2.isOn = true

在这里,我们试图将true分配给l2对象的isOn属性。 请注意,isOn属性为private,如果您尝试从类外部访问isOn,则会引发异常。


示例:Kotlin 类和对象

  1. class Lamp {
  2. // property (data member)
  3. private var isOn: Boolean = false
  4. // member function
  5. fun turnOn() {
  6. isOn = true
  7. }
  8. // member function
  9. fun turnOff() {
  10. isOn = false
  11. }
  12. fun displayLightStatus(lamp: String) {
  13. if (isOn == true)
  14. println("$lamp lamp is on.")
  15. else
  16. println("$lamp lamp is off.")
  17. }
  18. }
  19. fun main(args: Array<String>) {
  20. val l1 = Lamp() // create l1 object of Lamp class
  21. val l2 = Lamp() // create l2 object of Lamp class
  22. l1.turnOn()
  23. l2.turnOff()
  24. l1.displayLightStatus("l1")
  25. l2.displayLightStatus("l2")
  26. }

运行该程序时,输出为:

  1. l1 Lamp is on.
  2. l2 Lamp is off.

在上面的程序中

  • Lamp类已创建。
  • 该类具有isOn属性和三个成员函数turnOn()turnOff()displayLightStatus()
  • main()函数中创建了Lamp类的两个对象l1l2
  • 在此,使用l1对象:l1.turnOn()调用turnOn()函数。 此方法将l1对象的isOn实例变量设置为true
  • 并且,使用l2对象:l1.turnOff()调用turnOff()函数。 此方法将l2对象的isOff实例变量设置为false
  • 然后,针对l1l2对象调用displayLightStatus()函数,根据这些对象的On属性是true还是false

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

例如:

  1. class Lamp {
  2. // property (data member)
  3. private var isOn: Boolean = false
  4. // member function
  5. fun turnOn() {
  6. isOn = true
  7. }
  8. // member function
  9. fun turnOff() {
  10. isOn = false
  11. }
  12. fun displayLightStatus() {
  13. if (isOn == true)
  14. println("lamp is on.")
  15. else
  16. println("lamp is off.")
  17. }
  18. }
  19. fun main(args: Array<String>) {
  20. val lamp = Lamp()
  21. lamp.displayLightStatus()
  22. }

运行该程序时,输出为:

  1. lamp is off.

本文只是 Kotlin 中面向对象编程的介绍。 依次检查这些章节以了解更多信息:

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