# Kotlin 抽象类

> 原文： [https://www.programiz.com/kotlin-programming/abstract-class](https://www.programiz.com/kotlin-programming/abstract-class)

#### 在本文中，您将了解抽象类以及如何在 Kotlin 中实现抽象类（借助示例）。

与 Java 一样，`abstract`关键字用于在 Kotlin 中声明抽象类。 无法实例化抽象类（不能创建抽象类的对象）。 但是，您可以从它们中继承子类。

除非您明确使用`abstract`关键字将其抽象，否则抽象类的成员（属性和方法）是非抽象的。 让我们举个例子：

```kt
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 抽象类和方法

```kt
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)
}
```

运行该程序时，输出为：

```kt
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-programming/interfaces "Interfaces in Kotlin")

Kotlin 接口类似于抽象类。 但是，接口无法存储状态，而抽象类可以。

意思是，接口可能具有属性，但是它必须是抽象的，或者必须提供访问器实现。 而抽象类的属性不是强制性的。