Kotlin巢狀類和內部類
阿新 • • 發佈:2018-12-26
巢狀類
類可以巢狀在其他類中,需要通過外部類才可以訪問巢狀類的成員,外部類.巢狀類.巢狀類成員。巢狀類不能直接訪問外部類的成員。
class Outer {
private val bar: Int = 1
class Nested {
fun foo() = 2
}
}
val demo = Outer.Nested().foo() // == 2
內部類
類可以標記為 inner 以便能夠訪問外部類的成員。內部類會帶有一個對外部類的物件的引用。外部類訪問內部類:外部類.內部類.內部類成員。如果內部類與外部類有同名變數,那麼當內部類想要訪問外部類的同名變數時,需要用到this。如果 this 沒有限定符,它指的是最內層的包含它的作用域。要引用其他作用域中的 this,請使用標籤限定符( [email protected]),其中 @label 是一個代指 this 來源的標籤。
class Outer {
private val bar: Int = 1
inner class Inner {
val bar: String = ""
fun foo() = this@Outer.bar
}
}
val demo = Outer().Inner().foo() // == 1
匿名內部類
使用物件表示式建立匿名內部類例項:
interface TestInterface {
fun foo(pa: Int)
fun foo0()
}
class TestClazz {
fun bar(testInterface: TestInterface) {
testInterface.foo(1)
testInterface.foo0()
}
}
class Test {
var p1: Int = 1
fun test(mm: Int) {
val p2: Int = 1
val testClazz: TestClazz = TestClazz()
testClazz.bar(object : TestInterface {//匿名內部類
override fun foo(pa: Int) {
//匿名內部類可以訪問區域性變數和成員變數
p1 = p2 + pa
}
override fun foo0() {
}
})
}
}