📜  Kotlin抽象类abstract

📅  最后修改于: 2020-10-05 14:47:07             🧑  作者: Mango

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

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

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

abstract class Person {
    
    var age: Int = 40

    fun displaySSN(ssn: Int) {
        println("My SSN is $ssn.")
    }

    abstract fun displayJob(description: String)
}

这里,

  • 创建一个抽象类Person 。您不能创建该类的对象。
  • 该类具有一个非抽象的属性age和一个非抽象的方法displaySSN() 。如果您需要在子类中覆盖这些成员,则应使用open关键字标记它们。
  • 该类具有抽象方法displayJob() 。它没有任何实现,必须在其子类中重写。

注意:抽象类始终处于打开状态。您不需要显式使用open关键字从它们继承子类。


示例:Kotlin抽象类和方法
abstract class Person(name: String) {

    init {
        println("My name is $name.")
    }

    fun displaySSN(ssn: Int) {
        println("My SSN is $ssn.")
    }

    abstract fun displayJob(description: String)
}

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

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

fun main(args: Array) {
    val jack = Teacher("Jack Smith")
    jack.displayJob("I'm a mathematics teacher.")
    jack.displaySSN(23123)
}

运行该程序时,输出为:

My name is Jack Smith.
I'm a mathematics teacher.
My SSN is 23123.

在这里,班级Teacher是从抽象班级Person派生的。

教师类的对象插孔被实例化。创建时,我们已将"Jack Smith"作为参数传递给主构造函数。这将执行Person类的初始化程序块。

然后,使用jack对象调用displayJob()方法。注意, displayJob()方法在基类中声明为abstract,在派生类中重写。

最后,使用jack对象调用displaySSN()方法。该方法是非抽象的,并且在Person类中声明(并且不在Teacher类中声明)。


推荐读物: Kotlin接口

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

意思是,接口可能具有属性,但是它必须是抽象的,或者必须提供访问器实现。而抽象类的属性不是强制性的。