原文: https://www.programiz.com/kotlin-programming/abstract-class
在本文中,您将了解抽象类以及如何在 Kotlin 中实现抽象类(借助示例)。
与 Java 一样,abstract关键字用于在 Kotlin 中声明抽象类。 无法实例化抽象类(不能创建抽象类的对象)。 但是,您可以从它们中继承子类。
除非您明确使用abstract关键字将其抽象,否则抽象类的成员(属性和方法)是非抽象的。 让我们举个例子:
abstract class Person {var age: Int = 40fun 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<String>) {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派生。
实例化了Teacher类的对象jack。 在创建时,我们已将"Jack Smith"作为参数传递给主构造器。 这将执行Person类的初始化块。
然后,使用jack对象调用displayJob()方法。 请注意,displayJob()方法在基类中被声明为抽象,而在派生类中被覆盖。
最后,使用jack对象调用displaySSN()方法。 该方法是非抽象的,并且在Person类中声明(并且不在Teacher类中声明)。
推荐阅读:, Kotlin 接口
Kotlin 接口类似于抽象类。 但是,接口无法存储状态,而抽象类可以。
意思是,接口可能具有属性,但是它必须是抽象的,或者必须提供访问器实现。 而抽象类的属性不是强制性的。
