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



所有评论(0)