1. 程式人生 > >Kotlin巢狀類和內部類

Kotlin巢狀類和內部類

巢狀類

類可以巢狀在其他類中,需要通過外部類才可以訪問巢狀類的成員,外部類.巢狀類.巢狀類成員。巢狀類不能直接訪問外部類的成員。

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() { } }) } }