在本文中,您將借助示例學習使用嵌套類和內(nèi)部類。
與Java類似,Kotlin允許您在另一個稱為嵌套類的類中定義一個類
class Outer { ... .. ... class Nested { ... .. ... } }
由于嵌套類是其封閉類的外部(Outer)成員,因此可以使用. 符號訪問嵌套類及其成員。
class Outer { val a = "在嵌套類外部。" class Nested { val b = "在嵌套類內(nèi)部。" fun callMe() = "從嵌套類內(nèi)部進行函數(shù)調(diào)用。" } } fun main(args: Array<String>) { //訪問嵌套類的成員 println(Outer.Nested().b) //創(chuàng)建嵌套類的對象 val nested = Outer.Nested() println(nested.callMe()) }
運行該程序時,輸出為:
在嵌套類內(nèi)部。 從嵌套類內(nèi)部進行函數(shù)調(diào)用。
對于 Java 用戶
Kotlin中的嵌套類類似于Java中的靜態(tài)嵌套類。
在Java中,當您在另一個類中聲明一個類時,默認情況下它將成為一個內(nèi)部類。 但是在Kotlin中,您需要使用 inner 修飾符創(chuàng)建一個內(nèi)部類,我們將在下面討論。
Kotlin中的嵌套類無權(quán)訪問外部類實例。 例如,
class Outer { val foo = "在嵌套類外部。" class Nested { //錯誤! 無法訪問外部類的成員。 fun callMe() = foo } } fun main(args: Array<String>) { val outer = Outer() println(outer.Nested().callMe()) }
上面的代碼無法編譯,因為我們試圖從嵌套類內(nèi)部訪問外部類的foo屬性。
為了解決這個問題,您需要用 inner 標記嵌套類來創(chuàng)建一個內(nèi)部類。內(nèi)部類攜帶對外部類的引用,并且可以訪問外部類成員。
class Outer { val a = "在嵌套類外部。" inner class Inner { fun callMe() = a } } fun main(args: Array<String>) { val outer = Outer() println("使用外部對象: ${outer.Inner().callMe()}") val inner = Outer().Inner() println("使用內(nèi)部對象: ${inner.callMe()}") }
運行該程序時,輸出為:
使用外部對象: 在嵌套類外部。 使用內(nèi)部對象: 在嵌套類外部。