Kotlin for android學(xué)習(xí)七:對(duì)象表達(dá)式與對(duì)象聲明

前言

kotlin官網(wǎng)kotlin教程學(xué)習(xí)教程的筆記孕蝉。

背景

有時(shí)我們需要?jiǎng)?chuàng)建一個(gè)對(duì)象, 這個(gè)對(duì)象在某個(gè)類(lèi)的基礎(chǔ)上略做修改, 但又不希望僅僅為了這一點(diǎn)點(diǎn)修改就明 確地聲明一個(gè)新類(lèi). Java 通過(guò) 匿名內(nèi)部類(lèi)(anonymous inner class) 來(lái)解決這種問(wèn)題. Kotlin 使用 對(duì)象表達(dá) 式(object expression) 和 對(duì)象聲明(object declaration), 對(duì)這個(gè)概念略做了一點(diǎn)泛化.

一问顷、對(duì)象表達(dá)式

類(lèi)似匿名內(nèi)部類(lèi)
1. 通過(guò)對(duì)象表達(dá)式實(shí)現(xiàn)一個(gè)匿名內(nèi)部類(lèi)的對(duì)象用于方法的參數(shù)中

 recyclerview.addOnScrollListener(object :RecyclerView.OnScrollListener(){
})

textView.setOnClickListener(object :View.OnClickListener{
   override fun onClick(p0: View?) {
   }
})

**2.對(duì)象可以繼承于某個(gè)基類(lèi)饱亿,或者實(shí)現(xiàn)其他接口 **

open class A {}
interface B {}

 val ab = object : A(), B {}

如果, 我們 “只需要對(duì)象”, 而不需要繼承任何有價(jià)值的基類(lèi)

val ab = object{
            val a=0
            val b=1
        }
 println(ab.a + ab.b)

3. 注意

匿名對(duì)象可以用作只在本地和私有作用域中聲明的類(lèi)型蕉扮。如果你使用匿名對(duì)象作為公有函數(shù)的返回類(lèi)型或者用作公有屬性的類(lèi)型滩租,那么該函數(shù)或?qū)傩缘膶?shí)際類(lèi)型會(huì)是匿名對(duì)象聲明的超類(lèi)型探膊,如果你沒(méi)有聲明任何超類(lèi)型杠愧,就會(huì)是 Any。在匿名對(duì)象中添加的成員將無(wú)法訪問(wèn)逞壁。

class User {
   //私有函數(shù)流济,所以其返回類(lèi)型是匿名對(duì)象類(lèi)型
   private fun foo() = object {
       val x = "x"
   }

   //公有函數(shù),所以其返回類(lèi)型是 Any
   fun pfoo() = object {
       val x = "px"
   }

   //返回類(lèi)型是Any腌闯,則無(wú)法訪問(wèn)匿名對(duì)象中的成員
   private fun afoo(): Any = object {
       val x = "x"
   }

   fun check() {
       val x1 = foo().x //ok
       val x2 = pfoo().x //unresolved 錯(cuò)誤
       val x3=afoo().x //unresolved 錯(cuò)誤
   }
}

二绳瘟、對(duì)象聲明

類(lèi)似單例

  1. Kotlin中使用object關(guān)鍵字來(lái)聲明一個(gè)對(duì)象,因此可以方便的聲明一個(gè)單例:
object Site {
    var url: String = ""
    val name: String = ""
    fun foo() {}
}

fun main(args: Array<String>) {
    val s1 = Site
    val s2 = Site
    s1.url = "www.kotlin.com"
    println(s1.url) // 輸出 www.kotlin.com
    println(s2.url) // 輸出 www.kotlin.com
}
  1. 當(dāng)對(duì)象聲明在一個(gè)類(lèi)的內(nèi)部
class User {
    val name = "user"
    object Site {
        var url: String = ""
        fun foo() {
            val c = name //錯(cuò)誤绑嘹,不能訪問(wèn)到外部類(lèi)的方法和變量
        }
    }
}

fun main(args: Array<String>) {
    var s1 = User.Site //ok
    var s2 = User().Site //錯(cuò)誤稽荧,不能通過(guò)外部里的實(shí)例訪問(wèn)到該對(duì)象
}

三、同伴對(duì)象

還記得擴(kuò)展函數(shù)與擴(kuò)展屬性這一節(jié)中工腋,我們引入了同伴對(duì)象么姨丈?這里在詳細(xì)的說(shuō)明一下,順便知識(shí)回顧

 class User { 
   companion object { //同伴對(duì)象
        fun foo(){  }
   }
}
User.Companion.create() //默認(rèn)命名的調(diào)用
User.create() //可以忽略名稱(chēng)調(diào)用

當(dāng)然我們也可以給同伴對(duì)象命名

class User {
    companion object Factory{
        fun create():User= User()
    }
}
User.Factory.create() //命名后的調(diào)用
User.create() //忽略名稱(chēng)的調(diào)用

注意, 雖然同伴對(duì)象的成員看起來(lái)很像其他語(yǔ)言中的類(lèi)的靜態(tài)成員(static member), 但在運(yùn)行時(shí)期, 這些成員仍然是真實(shí)對(duì)象的實(shí)例的成員, 它們與靜態(tài)成員是不同的

例如, 它可以實(shí)現(xiàn)接口:

interface B{
    fun create():User
}
class User {
    companion object :B{
        override fun create():User= User()
    }
}

   User.create()

四擅腰、對(duì)象表達(dá)式與對(duì)象聲明在語(yǔ)義上的區(qū)別

  • 對(duì)象聲明是 延遲(lazily) 初始化的, 只會(huì)在首次訪問(wèn)時(shí)才會(huì)初始化
  • 對(duì)象表達(dá)式則會(huì)在使用處 立即 執(zhí)行(并且初始化)

參考資料

菜鳥(niǎo)教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟋恬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趁冈,更是在濱河造成了極大的恐慌歼争,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渗勘,死亡現(xiàn)場(chǎng)離奇詭異沐绒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)旺坠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)乔遮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人取刃,你說(shuō)我怎么就攤上這事蹋肮〕鏊ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵坯辩,是天一觀的道長(zhǎng)馁龟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)漆魔,這世上最難降的妖魔是什么坷檩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮改抡,結(jié)果婚禮上淌喻,老公的妹妹穿的比我還像新娘。我一直安慰自己雀摘,他們只是感情好裸删,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著阵赠,像睡著了一般涯塔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上清蚀,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天匕荸,我揣著相機(jī)與錄音,去河邊找鬼枷邪。 笑死榛搔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的东揣。 我是一名探鬼主播践惑,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘶卧!你這毒婦竟也來(lái)了尔觉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芥吟,失蹤者是張志新(化名)和其女友劉穎侦铜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钟鸵,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钉稍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棺耍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贡未。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羞秤,到底是詐尸還是另有隱情,我是刑警寧澤左敌,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布瘾蛋,位于F島的核電站,受9級(jí)特大地震影響矫限,放射性物質(zhì)發(fā)生泄漏哺哼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一叼风、第九天 我趴在偏房一處隱蔽的房頂上張望取董。 院中可真熱鬧,春花似錦无宿、人聲如沸茵汰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹂午。三九已至,卻和暖如春彬碱,著一層夾襖步出監(jiān)牢的瞬間豆胸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工巷疼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晚胡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓嚼沿,卻偏偏與公主長(zhǎng)得像估盘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骡尽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容