在本文中,您将学习抽象类以及如何在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关键字从它们继承子类。
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接口类似于抽象类。但是,接口不能存储状态,而抽象类可以。
也就是说,接口可能有属性,但它必须是抽象的或者必须提供访问器实现。然而,抽象类的属性不是必须是抽象的。