欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Kotlin学习之对象表达式

程序员文章站 2022-06-15 22:49:21
什么是对象表达式Java当中匿名内部类在很多场景下得到了大量的使用,而Kotlin的对象表达式就是为了解决匿名内部类的一些缺陷而产生的我们来回顾一下匿名内部类:既然叫匿名内部类,这个类是没有名字的。匿名内部类本身一定是继承了某一个父类,或者是实现了某一个接口Java运行时会将该匿名内部类当做它所实现的接口或者是所继承的父类来看待匿名内部类所提供的功能,对象表达式都可以支持,匿名内部类有的限制,对象表达式可以突破这个限制。对象表达式的格式:object[:若干个父类型,中间用逗...

什么是对象表达式

Java当中匿名内部类在很多场景下得到了大量的使用,而Kotlin的对象表达式就是为了解决匿名内部类的一些缺陷而产生的

我们来回顾一下匿名内部类:

  • 既然叫匿名内部类,这个类是没有名字的。
  • 匿名内部类本身一定是继承了某一个父类,或者是实现了某一个接口
  • Java运行时会将该匿名内部类当做它所实现的接口或者是所继承的父类来看待

匿名内部类所提供的功能,对象表达式都可以支持,匿名内部类有的限制,对象表达式可以突破这个限制。

对象表达式的格式:

object[:若干个父类型,中间用逗号隔开]{

}
interface MyInterface{
    fun myPrint(i:Int)
}

abstract class MyAbstractClass{
    abstract val age:Int

    abstract fun printMyAbstractClassInfo()

}

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main10)

        val myObject = object : MyInterface {
            override fun myPrint(i: Int) {
                println("i的值是$i")
            }
        }

        myObject.myPrint(100)
    }

这段代码就是一个典型的对象表达式的应用。其实可以理解成一个匿名内部类的意思,都表示实现了一个接口,把接口里面的方法都实现出来,然后返回来一个对象。

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main10)
        var myObject2 = object {
            init {
                println("初始化块zhix")
            }

            var myProperty = "hello world"

            fun myMethod() = "myMethod()"
        }

        myObject2.myMethod()
}

这种是不实现任何接口和不继承任何抽象类的对象表达式

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main10)

        var myObject3 = object : MyInterface, MyAbstractClass() {
            override fun myPrint(i: Int) {
                println("i的值是$i")
            }

            override val age: Int
                get() = 30

            override fun printMyAbstractClassInfo() {
                println("printMyAbstractClassInfo 执行")
            }

        }

        myObject3.myPrint(200)
        myObject3.age
        myObject3.printMyAbstractClassInfo()
    }

这种是对象表达式的多个父类的情况。

 

本文地址:https://blog.csdn.net/jingerlovexiaojie/article/details/107365157