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<T> {
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中创建对象的多种方式,包括对象表达式、对象声明(单例模式)、伴生对象、常规类实例化以及通过单方法Java接口的SAM转换。通过实例和关键点分析,阐述了各种方式的特点和应用场景,如线程安全、匿名对象和接口实现。
2315

被折叠的 条评论
为什么被折叠?



