Kotlin學習之伴生對象companion object

對象聲明

我們都知道在在Java中 不可能單純有一個對象存在的,對象一定是通過類來創建它的實例的,通過new這個關鍵字來創建一個類的對象,這樣呢,這個對象纔會在內存當中創建出來。

在Kotlin當中,有這麼一個新的概念,可以直接聲明個對象,我們定義一個類用class關鍵字,我們聲明一個對象就用object關鍵字。它的語法呢和Kotlin類的語法是極爲相似的。

object MyObject{
    
}

這就是對象聲明,並且它總是在 object 關鍵字後跟⼀個名稱。表示我聲明瞭一個對象,對象的名字叫MyObject。對象是可以擁有屬性也可以擁有方法的,跟類是一樣的。

object MyObject {
    fun method() {

    }
}

定義好對象之後呢,就可以直接調用了

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
       
        MyObject.method()
    }

因爲本身就是一個對象了,不需要像類一樣要創建實例,可以直接調用方法。這就被稱作對象聲明。

伴生對象

在Kotlin中,與Java不同的是,類是沒有static方法的。在大多數情況下,Kotlin推薦的做法是使用包級別的函數作爲靜態方法。

所以Kotlin會將包級別的函數當做靜態方法來看待。

什麼叫伴生對象,就是隨着類的存在而存在。

class MyTest {
   companion object MyObject{

   }
}

我創建了一個MyObject的伴生對象,它隨着外面的類MyClass的而存在。

class MyTest {
    companion object MyObject {
        var num: Int = 100

        fun method() {
            println("method invoked")
        }
    }
}

在裏面定義了成員變量num和method方法。這裏面的語法和普通的類是一樣的,但是這個伴生對象到底會起一個什麼樣的作用呢?

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        MyTest.MyObject.method()
    }

使用裏面的method()方法,還可以通過用類名直接調用方法和屬性:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        MyTest.method()
        MyTest.num
    }

這類似於Java中的靜態方法,這就是伴生對象所起到的重要作用。

還可以把伴生對象名字省略掉,也是可以的。因爲我們直接用類名調用屬性和方法,這個名字是無用的。

class MyTest {
    companion object {
        var num: Int = 100

        fun method() {
            println("method invoked")
        }
    }
}

請注意,即使伴⽣對象的成員看起來像其他語⾔的靜態成員,在運⾏時他們仍然是真實對象的實例成 員,我們可以使⽤ @JvmStatic

註解,你可以將伴⽣對象的成員⽣成爲真正的靜態⽅法和 字段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章