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去执行,所以本质上它是不会违背这一点的。
匿名内部就暂时记录这么多吧!