在本文中,您將學習抽象類以及如何在Kotlin中實現(xiàn)抽象類(借助示例)。
與Java一樣,abstract 關鍵字用于在Kotlin中聲明抽象類。無法實例化抽象類(不能創(chuàng)建抽象類的對象)。但是,您可以從它們中繼承子類。
除非您明確使用 abstract 關鍵字將其抽象,否則抽象類的成員(屬性和方法)是非抽象的。讓我們舉個實例:
abstract class Person { var age: Int = 40 fun displaySSN(ssn: Int) { println("我的社保號是: $ssn.") } abstract fun displayJob(description: String) }
這里,
創(chuàng)建一個抽象類 Person 。您不能創(chuàng)建該類的對象。
該類具有非抽象屬性 age和非抽象方法 displaySSN()。如果您需要在子類中覆蓋這些成員,則應使用 open 關鍵字標記它們。
該類具有抽象方法 displayJob()。它沒有任何實現(xiàn),必須在其子類中重寫。
注意:抽象類總是開放的。 您不需要顯式使用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("我是一名數(shù)學老師。") jack.displaySSN(23123) }
運行該程序時,輸出為:
我的名字是 Jack Smith. 我是一名數(shù)學老師。 我的社保號是 23123.
在這里, Teacher 類派生自抽象類 Person
Teacher 類的對象 jack 被實例化。在創(chuàng)建主構造函數(shù)時,我們將“ Jack Smith”作為參數(shù)傳遞給它。這將執(zhí)行 Person 類的初始化塊。
然后,使用Jack對象調用displayJob()方法。 請注意,displayJob()方法在基類中被聲明為抽象的,并在派生類中被覆蓋。
最后,使用Jack對象調用displaySSN()方法。 該方法是非抽象的,在 Person 類中聲明(而不是在 Teacher 類中聲明)。
相關知識: Kotlin 接口
Kotlin接口類似于抽象類。但是,接口不能存儲狀態(tài),而抽象類可以。
也就是說,接口可能有屬性,但它必須是抽象的或者必須提供訪問器實現(xiàn)。然而,抽象類的屬性不是必須是抽象的。