kotlin学习之伴生对象(十五)
目錄
- 1. 基本用法
- 2. 實現(xiàn)接口
- 3. 伴生對象擴展
伴生對象最簡單直白的理解就是與一個類相伴而生的對象,由于它處于類內(nèi)部,所以必然和包含它的類存在某種聯(lián)系。
1. 基本用法
伴生對象使用關(guān)鍵字companion來聲明,看起來就像是在object關(guān)鍵字前面加的一個修飾符。它的一般格式如下:
class 外部類名{companion object 伴生對象名{//屬性//方法} }簡單的代碼示例如下
companion <span class="hljs-class"><span class="hljs-keyword">object</span> {</span>fun test(){println(<span class="hljs-string">"Companion Object..."</span>)}} }你會發(fā)現(xiàn)上面的代碼中沒有伴生對象名,因為它是可以省略的。下面就依次看看伴生對象都用在那些地方。
在Java中有static關(guān)鍵字表示靜態(tài)成屬性和方法,但在Kotlin中沒有static關(guān)鍵字,所以伴生對象和頂層函數(shù)一起來彌補了這一缺憾,還是看上面給出的第一個例子,那我們怎么去調(diào)用伴生對象中的方法呢。
上面的代碼連伴生對象的名字都省略了,所以我們只能通過外部類來調(diào)用。格式如下:
外部類.伴生對象內(nèi)部方法如下所示:
fun main(args: <span class="hljs-keyword">Array</span><<span class="hljs-keyword">String</span>>) <span class="hljs-list">{A.test() }當(dāng)然對于指定了伴生對象名的情況,調(diào)用格式如下:
外部類.伴生對象名.伴生對象內(nèi)部方法代碼示例如下:
class B{companion object KB{fun testB(){println("Companion Object...")}} }fun main(args: Array<String>) {B.testB()B.KB.testB() }當(dāng)然你會發(fā)現(xiàn),你在調(diào)用時仍然可以省略掉伴生對象名,就像Java中通過類名直接調(diào)用靜態(tài)方法一樣。
當(dāng)然,對于在聲明時省略了伴生對象名的情況,Kotlin也提供了一個叫Companion的默認(rèn)名稱,所以我們也可以像下面的方式進(jìn)行調(diào)用:
其實伴生對象的出現(xiàn)也是為了彌補頂層函數(shù)的不足,頂層函數(shù)不能訪問一個類中的private成員,而伴生對象是可以訪問的,如下面代碼所示:
class C{private val age: Int = 0;companion object {fun out(){//伴生對象中可以調(diào)用外部的私有成員println(C().age)}} }fun main(args: Array<String>) {//頂層函數(shù)不能調(diào)用外部類的私有成員println(C().age) //報錯 }2. 實現(xiàn)接口
伴生對象在聲明的時候可以像其他類那樣實現(xiàn)接口,并實現(xiàn)接口中的方法,如下面的代碼所示:
class People(val name: String){//伴生對象實現(xiàn)接口companion object : Log{//實現(xiàn)接口的方法override fun printLog(msg: String) {println("msg ------- $msg")}} }//該方法的參數(shù)是接口實例 fun callLog(log: Log){log.printLog("msg") }fun main(args: Array<String>) {//傳入實現(xiàn)接口的伴生對象的類callLog(People) }上面的代碼可以這樣理解,伴生對象實現(xiàn)了接口,伴生對象又與外部類存在關(guān)聯(lián),所以相當(dāng)于外部類也實現(xiàn)了接口,所以我們可直接傳入外部類的名稱,這里的這個名稱就指代了那個伴生對象。
3. 伴生對象擴展
在前面的內(nèi)容中我們也說過方法擴展,那這里我們的伴生對象也可以進(jìn)行擴展,我們可以在其上擴展我們自己的方法。這里所謂的擴展就是在聲明伴生對象的時候沒有指定函數(shù),而是在類的外部來給伴生對象增加方法,來看看下面的代碼示例:
class Person(val name: String){companion object {//伴生對象內(nèi)部沒有方法} }//伴生對象擴展方法 fun Person.Companion.toJson(person: Person): String{//具體實現(xiàn)return ""; }fun main(args: Array<String>) {//調(diào)用方法val str = Person.toJson(Person("小白")) }上面的擴展方法和函數(shù)的擴展差別不大,主要是要訪問到擴展對象再在其上擴展方法。
總結(jié)
以上是生活随笔為你收集整理的kotlin学习之伴生对象(十五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓总结 之 OkHttp使用及源码分析
- 下一篇: 开始使用gradle(二)