Kotlin中的object 與companion object的區別

區別:
companion object 類中只能一個 聲明週期跟類同步,Only one companion object is allowed per class
objcet 沒有限制聲明  更多用在對象聲明,對象表達式使用。
       能夠聲明在類裏  也能夠聲明在頂級包下 top-level declaration
使用原則:       
       若是想寫工具類的功能,直接建立文件,寫 top-level「頂層」函數。(聲明在包下)
       若是須要繼承別的類或者實現接口,就用 object 或 companion object。
複製代碼

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

kotlin中調用
fun init() {
    MyObject.a()
}
複製代碼
java中調用
MyObject.INSTANCE.a();
複製代碼

companion object

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();
複製代碼

在companion object中如何調用外部的成員變量

這個 跟java的靜態方法 去調用成員變量同樣的,是調用不了滴 騷年!code

能夠將成員變量聲明在 伴生類companion object類裏對象

companion object {
    private val MY_TAG = "DemoManager"
    fun b() {
        Log.e(MY_TAG,"此時 companion objec t表示 伴生對象")
    }
}複製代碼

www.jianshu.com/p/14db81e15…
繼承

相關文章
相關標籤/搜索