跳到主要内容

Kotlin 抽象类

提示
  1. 抽象类定义:在 Kotlin 中,使用 abstract 关键字声明抽象类,它们不能被实例化,但可以派生出子类。
  2. 成员特性:抽象类可以包含非抽象(具体)成员(属性和方法),除非显式标记为 abstract。抽象方法必须在子类中实现。
  3. 继承和重写:抽象类总是开放的,无需使用 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 接口与抽象类相似。然而,接口不能存储状态,而抽象类可以。

这意味着,接口可能有属性,但它需要是抽象的或提供访问器实现。而抽象类的属性不是必须是抽象的。