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