Kotlin 抽象类
提示
- 抽象类定义:在 Kotlin 中,使用
abstract
关键字声明抽象类,它们不能被实例化,但可以派生出子类。 - 成员特性:抽象类可以包含非抽象(具体)成员(属性和方法),除非显式标记为
abstract
。抽象方法必须在子类中实现。 - 继承和重写:抽象类总是开放的,无需使用
open
关键字就可以继承。子类必须重写所有抽象方法,而非抽象成员可选择性重写。
就像 Java 一样,在 Kotlin 中使用 abstract
关键字来声明抽象类。抽象类不能被实例化(你不能创建一个抽象类的对象)。然而,你可以从它们派生子类。
抽象类的成员(属性和方法)是非抽象的,除非你明确使用 abstract
关键字使它们成为抽象的。让我们看一个例子:
abstract class Person {
var age: Int = 40
fun displaySSN(ssn: Int) {
println("我的 SSN 是 $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 是 $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。
我是一名数学教师。
我的 SSN 是 23123。
这里,类 Teacher
派生自抽象类 Person
。
实例化了 Teacher
类的对象 jack
。我们在创建它时向主构造函数传递了 "Jack Smith"
作为参数。这执行了 Person
类的初始化块。
然后,使用 jack
对象调用 displayJob()
方法。注意,displayJob()
方法在基类中声明为抽象的,并在派生类中重写。
最后,使用 jack
对象调用 displaySSN()
方法。该方法是非抽象的,在 Person
类中声明(并未在 Teacher
类中声明)。
推荐阅读: Kotlin 接口
Kotlin 接口与抽象类相似。然而,接口不能存储状态,而抽象类可以。
这意味着,接口可能有属性,但它需要是抽象的或提供访问器实现。而抽象类的属性不是必须是抽象的。