像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接口类似于抽象类。但是,接口不能存储状态,而抽象类可以。
意思是,接口可能具有属性,但是它必须是抽象的,或者必须提供访问器实现。而抽象类的属性不是强制性的。