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去执行,所以本质上它是不会违背这一点的。

匿名内部就暂时记录这么多吧!

05-16 08:03