抽象類的成員(屬性和方法)不是抽象的,除非您使用abstract關鍵字顯式抽象它們。讓我們舉個例子:
這裏,
註意:抽象類總是開放的。您不需要顯式使用open關鍵字來繼承它們的子類。
運行該程序時,輸出是:
在這裏,教師類是從抽象類Person派生出來的。
教師類的對象jack被實例化。當我們創建主構造函數時,我們將“傑克·史密斯”作為參數傳遞給它。這將執行Person類的初始化塊。
然後,使用Jack對象調用displayJob()方法。請註意,displayJob()方法在基類中被聲明為抽象方法,並在派生類中被重寫。
最後,使用Jack對象調用displaySSN()方法。這個方法是非抽象的,並且是在Person類中聲明的(不是在Teacher類中)。
Kotlin接口類似於Java 8中的接口。它們可以包括抽象方法的定義和非抽象方法的實現。但是,它們不能包含任何狀態。
也就是說,接口可以有屬性,但它必須是抽象的或者必須提供訪問器實現。
推薦閱讀:科特林抽象課
Kotlin中的抽象類類似於接口,但有壹個重要的區別。抽象類的屬性不必是抽象的,也不必由訪問器實現。
關鍵字interface用於定義Kotlin中的接口。舉個例子,
這裏,
這是類或對象實現接口的方式:
這裏,InterfaceImp類實現了MyInterface接口。
該類覆蓋接口的抽象成員(test屬性和foo()方法)。
運行該程序時,輸出是:
如前所述,接口還可以具有提供訪問器實現的屬性。舉個例子,
運行該程序時,輸出是:
這裏,prop不是抽象的,但它在接口中是有效的,因為它提供了訪問器的實現。
但是,您不能在接口內部執行類似val prop:Int = 23的操作。
Kotlin不允許真正的多重繼承。但是,壹個類中可以實現兩個或更多接口。舉個例子,
運行該程序時,輸出是:
解決重寫沖突(多接口)
假設兩個接口(A和B)具有同名的非抽象方法(假設callMe()方法)。妳在壹個類中實現這兩個接口(假設是C語言)。現在,如果用C類的對象調用callMe()方法,編譯器將拋出錯誤。例如
這是引發的錯誤:
要解決這個問題,您需要提供自己的實現。這是如何做到的:
現在,當您運行該程序時,輸出將是:
這裏,C類中提供了callMe()方法的顯式實現。
超級語句