美文网首页
Kotlin 对象表达式

Kotlin 对象表达式

作者: 竖起大拇指 | 来源:发表于2021-02-26 16:29 被阅读0次

1. 前言

有时候我们想要创建一个对当前类有一点小修改的对象,但是不想重新声明一个子类。java用匿名内部类的概念解决这个问题。Kotlin用对象表达式和对象声明巧妙的实现了这一概念。

2.java实现

/**
 * Created by maozonghong
 * on 2021/2/26
 */
class MyClass {

    public String name;

    public MyClass(String name){
        this.name=name;
    }

    public void verify(){

        System.out.println("verify");
    }
}

public class ObjectExpression {

    public static void process(MyClass obj){

        obj.verify();
    }

    public static void main(String[] args){

        process(new MyClass("Mao"){

            @Override
            public void verify() {
                System.out.println("object verify");
            }
        });
    }
}

输入如下:

object verify

3.Kotlin实现

Kotlin中的对象是为了代替Java中的匿名类

3.1 基本使用

如果父类有构造函数,则必须传递相应的构造函数。多个父类可以用逗号隔开,跟在冒号后面。

open class KotlinClass (var name:String){

    open fun verify(){

        println("verify")
    }

}

interface MyInterface {

    fun closeData(){
        println("close data")
    }
}


open class ObjectExpression {

    companion object{

        fun process(obj:KotlinClass){
            obj.verify()

            if(obj is MyInterface){
                obj.closeData()
            }
        }

        @JvmStatic
        fun main(args: Array<String>) {

            process(object:KotlinClass("Mao"),MyInterface{

                override fun verify() {

                    println("object verify")
                }
            })

            foo()
        }


        //直接建立对象
        fun foo(){

            val obj=object{
                var x:Int=10
                var y:Int=20
            }

            println(obj.x+obj.y)

        }


    }
}
输出如下:
object verify
close data
30
Process finished with exit code 0

3.2 没有父类的对象

有时候我们只是需要一个没有父类的对象,我们可以这样写:

val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)

3.3 访问封闭域内的对象

像 java 的匿名内部类一样,对象表达式可以访问闭合范围内的变量 (和 java 不一样的是,这些变量不用是 final 修饰的)

fun countClicks(windows: JComponent) {
var clickCount = 0
var enterCount = 0

window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        clickCount++
}

    override fun mouseEntered(e: MouseEvent){
      enterCount++
}
})

}

相关文章

网友评论

      本文标题:Kotlin 对象表达式

      本文链接:https://www.haomeiwen.com/subject/sicmfltx.html