日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kotlin学习之伴生对象(十五)

發(fā)布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kotlin学习之伴生对象(十五) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 1. 基本用法
  • 2. 實現(xiàn)接口
  • 3. 伴生對象擴展

伴生對象最簡單直白的理解就是與一個類相伴而生的對象,由于它處于類內(nèi)部,所以必然和包含它的類存在某種聯(lián)系。

伴生對象使用關(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>&lt;<span class="hljs-keyword">String</span>&gt;) <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)用:

class A{companion object {fun test(){println("Companion Object...")}} }fun main(args: Array<String>) {A.test()//默認(rèn)名稱A.Companion.test() }

其實伴生對象的出現(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) //報錯 }

伴生對象在聲明的時候可以像其他類那樣實現(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)了接口,所以我們可直接傳入外部類的名稱,這里的這個名稱就指代了那個伴生對象。

在前面的內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。