Kotlin 抽象类(Abstract)

在本文中,您将学习抽象类以及如何在Kotlin中实现抽象类(借助示例)。

与Java一样,abstract 关键字用于在Kotlin中声明抽象类。无法实例化抽象类(不能创建抽象类的对象)。但是,您可以从它们中继承子类。

除非您明确使用 abstract 关键字将其抽象,否则抽象类的成员(属性和方法)是非抽象的。让我们举个实例:

abstract class Person {
    
    var age: Int = 40

    fun displaySSN(ssn: Int) {
        println("我的社保号是: $ssn.")
    }

    abstract fun displayJob(description: String)
}

这里,

  • 创建一个抽象类 Person 。您不能创建该类的对象。

  • 该类具有非抽象属性 age和非抽象方法 displaySSN()。如果您需要在子类中覆盖这些成员,则应使用 open 关键字标记它们。

  • 该类具有抽象方法 displayJob()。它没有任何实现,必须在其子类中重写。

注意:抽象类总是开放的。 您不需要显式使用open关键字从它们继承子类。

示例:Kotlin抽象类和方法

abstract class Person(name: String) {

    init {
        println("我的名字是 $name.")
    }

    fun displaySSN(ssn: Int) {
        println("我的社保号是 $ssn.")
    }

    abstract fun displayJob(description: String)
}

class Teacher(name: String): Person(name) {

    override fun displayJob(description: String) {
        println(description)
    }
}

fun main(args: Array<String>) {
    val jack = Teacher("Jack Smith")
    jack.displayJob("我是一名数学老师。")
    jack.displaySSN(23123)
}

运行该程序时,输出为:

我的名字是  Jack Smith.
我是一名数学老师。
我的社保号是 23123.

在这里, Teacher 类派生自抽象类 Person

Teacher 类的对象 jack 被实例化。在创建主构造函数时,我们将“ Jack Smith”作为参数传递给它。这将执行 Person 类的初始化块。

然后,使用Jack对象调用displayJob()方法。 请注意,displayJob()方法在基类中被声明为抽象的,并在派生类中被覆盖。
最后,使用Jack对象调用displaySSN()方法。 该方法是非抽象的,在 Person 类中声明(而不是在 Teacher 类中声明)。

相关知识: Kotlin 接口

Kotlin接口类似于抽象类。但是,接口不能存储状态,而抽象类可以。

也就是说,接口可能有属性,但它必须是抽象的或者必须提供访问器实现。然而,抽象类的属性不是必须是抽象的。