kotlin 匿名內部類知識點碎碎記錄

kotlin中的匿名內部類該如何創建?

 一個匿名內部類肯定是實現了一個接口或者是繼承一個類,並且只能是一個,用數學術語說是“有且只有一個”

語法形式:object [ : 接口1,接口2,類型1, 類型2]{}    //中括號中的可省略

使用案例:

1、

interface Test {
    fun test()
}

fun main(args: Array<String>) {

    val t = object : Test {
        override fun test() {
            println("test......")
        }
    }

    t.test()//打印test......
}

使用方式也是非常簡單,一個隱藏的類實際上還是繼承了Test接口,所以還要實現裏面的方法。

2、不實現任何接口和類,並且在匿名內部類中添加方法

fun main(args: Array<String>) {

    val obj = object  {
        fun test() {
            println("test......")
        }
    }

    obj.test()  //打印:test......
}

從這個例子可以看出,前面我們提到的Java匿名內部類的第一個侷限的地方在Kotlin中就不存在了,新添加的方法也是可以調用的。

3、實現多個接口和類

fun main(args: Array<String>) {
    val test = object : Test1, Test2() {
        override fun test1() {

        }

        override fun test2() {

        }

    }
    test.test1()
    test.test2()
}

這個例子我們可以看出,比Java強大之處就顯而易見了。

4、再舉一個例子:

class Test {
    private val test1 = object {
        fun method() {
            println("private")
        }
    }
    val test2 = object {
        fun method() {
            println("public")
        }
    }
    fun test3() = object {
        fun method(){
            println("method")
        }
    }
    fun invoke(){
        val local = object {
            fun method(){
                println("local")
            }
        }
        local.method()  //編譯通過
        test1.method()    //編譯通過
        test2.method()   //編譯通不過
        test3().method()    //編譯通不過
    }
}

就像上述例子的結果一樣,匿名內部類只有在局部變量或者是成員變量(必須是私有的private)的時候纔會是有效的,編譯器纔會通過,其中test3這個方法也是很奇怪,我的理解大概是fun test3()返回一個對象接收的事匿名內部類,我是這樣的理解這個代碼的,不然你肯定會想怎麼會聲明一個方法來接收一個對象呢?哎,kotlin就是這樣神奇,很多語法看起來有一點莫名其妙,實則給我們提供了很多便利!

5、關於在匿名對象中訪問同一作用下定義的局部變量的問題

我們知道在Java中內部類訪問外部類的成員變量,那成員變量必須得是final的,但是kotlin中這個特點不存在了。

var a = 1
val obj = object {
    fun method() {
        a++
    }
}

obj.method()
println(a)    //打印出2

在Java中,實際上在method方法中使用的a實際上是局部變量a的一份拷貝,而不是它本身。而在Kotlin最終也是要編譯成字節碼供JVM去執行,所以本質上它是不會違背這一點的。

匿名內部就暫時記錄這麼多吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章