在本文中,您將借助示例學習使用嵌套類和內(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)部對象: 在嵌套類外部。