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去執行,所以本質上它是不會違背這一點的。
匿名內部就暫時記錄這麼多吧!