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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值