區別:
companion object 類中只能一個 聲明週期跟類同步,Only one companion object is allowed per class
objcet 沒有限制聲明 更多用在對象聲明,對象表達式使用。
能夠聲明在類裏 也能夠聲明在頂級包下 top-level declaration
使用原則:
若是想寫工具類的功能,直接建立文件,寫 top-level「頂層」函數。(聲明在包下)
若是須要繼承別的類或者實現接口,就用 object 或 companion object。
複製代碼
object 關鍵字能夠表達兩種含義:一種是對象表達式,另外一種是 對象聲明。複製代碼
繼承一個匿名對象java
val textView = findViewById<TextView>(R.id.tv)
textView.setOnClickListener(object : OnClickListener {
override fun onClick(p0: View?) {
Toast.makeText(this@TestActivity, "點擊事件生效", Toast.LENGTH_LONG)
}
})
複製代碼
上面代碼其實就是咱們常常要給 view
設置的點擊事件,OnClickListener
事件是一個匿名類的對象,用object
來修飾。bash
直接聲明類
用object 修飾的類爲靜態類,裏面的方法和變量都爲靜態的。
object DemoManager {
private val TAG = "DemoManager"
fun a() {
Log.e(TAG,"此時 object 表示 聲明靜態內部類")
}
}
又能夠聲明靜態內部類
類內部的對象聲明,沒有被inner 修飾的內部類都是靜態的
class DemoManager{
object MyObject {
fun a() {
Log.e(TAG,"此時 object 表示 直接聲明類")
}
}
}
複製代碼
若是須要調用 a()
方法ide
fun init() {
MyObject.a()
}
複製代碼
MyObject.INSTANCE.a();
複製代碼
companion object
修飾爲伴生對象,伴生對象在類中只能存在一個,相似於java中的靜態方法 Java 中使用類訪問靜態成員,靜態方法。函數
一個類中最多隻能夠有一個伴生對象,但能夠有多個嵌套對象,就像皇帝后宮佳麗三千,但皇后只有一個。
工具
companion object {
private val TAG = "DemoManager"
fun b() {
Log.e(TAG,"此時 companion objec t表示 伴生對象")
}
}複製代碼
kotlin 中調用this
fun init(){
b()
}
複製代碼
java 中調用spa
DemoManager.Companion.b();
複製代碼
這個 跟java的靜態方法 去調用成員變量同樣的,是調用不了滴 騷年!code
能夠將成員變量聲明在 伴生類companion object類裏對象
companion object {
private val MY_TAG = "DemoManager"
fun b() {
Log.e(MY_TAG,"此時 companion objec t表示 伴生對象")
}
}複製代碼