Kotlin对象的生成方式整理

Kotlin中可能有如下几种生成对象的方式

 

1,对象表达式

val myObject = object { } //匿名生成,赋给变量,或作为匿名对象使用

一个最简但完整的示例:

open class A(x: Int) {

    public open val y: Int = x

}

interface B { /*……*/ }

 

val ab: A = object : A(1), B {

    override val y = 15

    var x: Int = 0

    fun boo(){ }

}

注意

继承自A(1),其中还上传了一个参数给父类构造函数

实现接口B

对象内可以有方法及属性,也可以覆盖父类属性

 

 

2,对象声明,极方便的单例模式

object MyObject { } //不能是赋值的右值,直接给出名字

常用于监听器示例

object DefaultListener : MouseAdapter() {

    override fun mouseClicked(e: MouseEvent) { …… }

    override fun mouseEntered(e: MouseEvent) { …… }

}

与对象表达式的区别在于:

(1),对象声明不是表达式,不能放在赋值语句的右边,所以要引用的话,上述示例只能直接使用DefaultListener这个名称

(2),对象声明的初始化过程是线程安全的并且在首次访问时进行,因为这是一个“声明”,而之前的对象表达式是可执行语句的一部分

 

 

2.1,伴生对象是对象声明的一种特例

class MyClass {

    companion object { } //匿名或不匿名生成,赋给class

}

 

3,任何面向对象语言都有的,即声明类,再“new一个对象”,只不过kotlin省略了“new”

class Person(firstName: String) { }

val customer = Person("Joe Smith")

 

4,单方法Java接口可以生成Kotlin对象,但是Kotlin接口不能生成Kotlin对象

Java接口:

public interface Observer {

    void onChanged(T t);

}

Kotlin对象:

wordViewModel.allWords.observe(this, Observer { words ->

    // Update the cached copy of the words in the adapter.

    words?.let { adapter.setWords(it) }

})

注意里面的Observer,是一个单方法的接口,这里使用了SAM转换

注意多方法的Java接口不能转换为Kotlin对象,似乎这里有讨论:https://youtrack.jetbrains.com/issue/KT-7770

你可能感兴趣的:(Kotlin)