Kotlin中的對(duì)象表達(dá)式和對(duì)象聲明的具體使用
Kotlin的對(duì)象表達(dá)式與Java中的匿名內(nèi)部類的主要區(qū)別:匿名內(nèi)部類只能指定一個(gè)父類型,但對(duì)象表達(dá)式可以指定0~N個(gè)膚類型。
一、對(duì)象表達(dá)式
對(duì)象表達(dá)式的語(yǔ)法格式如下:
object [: 0~N個(gè)父類型]{ //對(duì)象表達(dá)式的類體部分 }
對(duì)象表達(dá)式還有如下規(guī)則:
- 對(duì)象表達(dá)式不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建對(duì)象表達(dá)式時(shí)會(huì)立即創(chuàng)建對(duì)象。因此不允許將對(duì)象表達(dá)式定義成抽象類。
- 對(duì)象表達(dá)式不能定義構(gòu)造器。但對(duì)象表達(dá)式可以定義初始化塊,可以通過(guò)初始化塊來(lái)完成構(gòu)造器需要完成的事情。
- 對(duì)象表達(dá)式可以包含內(nèi)部類,不能包含嵌套類。
package `0705` interface Outputable { fun output(msg: String) } abstract class Product(var price: Double) { abstract val name: String abstract fun printInfo() } fun main(args: Array<String>) { //指定一個(gè)父類型(接口)的對(duì)象表達(dá)式 var ob1 = object : Outputable { override fun output(msg: String) { for (i in 1..6) { println("<h${i}>${msg}</h${i}>") } } } ob1.output("隨便輸出點(diǎn)什么吧") println("-----------------------------------------------") //指定零個(gè)父類型的對(duì)象表達(dá)式 var ob2 = object { //初始化塊 init { println("初始化塊") } //屬性 var name = "Kotlin" //方法 fun test() { println("test方法") } //只能包含內(nèi)部類,不可以包含嵌套類 inner class Inner } println(ob2.name) ob2.test() println("-----------------------------------------------") //指定兩個(gè)父類型的對(duì)象表達(dá)式 var ob3 = object : Outputable, Product(1.23) { override fun output(msg: String) { println("輸出信息:${msg}") } override val name: String get() = "激光打印機(jī)" override fun printInfo() { println("高速極光打印機(jī)們支持自動(dòng)雙面打??!") } } println(ob3.name) ob3.output("Kotlin慢慢學(xué)") ob3.printInfo() }
輸出結(jié)果:
<h1>隨便輸出點(diǎn)什么吧</h1>
<h2>隨便輸出點(diǎn)什么吧</h2>
<h3>隨便輸出點(diǎn)什么吧</h3>
<h4>隨便輸出點(diǎn)什么吧</h4>
<h5>隨便輸出點(diǎn)什么吧</h5>
<h6>隨便輸出點(diǎn)什么吧</h6>
-----------------------------------------------
初始化塊
Kotlin
test方法
-----------------------------------------------
激光打印機(jī)
輸出信息:Kotlin慢慢學(xué)
高速極光打印機(jī)們支持自動(dòng)雙面打?。?br />
Kotlin的對(duì)象表達(dá)式可分為兩種情形:
- 對(duì)象表達(dá)式在方法的局部范圍內(nèi),或使用private修飾的對(duì)象表達(dá)式,Kotlin編譯器可識(shí)別對(duì)象表達(dá)式的真實(shí)類型。
- 非private修飾的對(duì)象表達(dá)式與Java的匿名內(nèi)部類相似,編譯器只會(huì)把對(duì)象表達(dá)式當(dāng)成它所繼承的父類或所實(shí)現(xiàn)的接口處理。如果它沒有父類型,系統(tǒng)當(dāng)它是Any類型。
package `0705` class ObjectExprType { private val ob1 = object { val name: String = "Kotlin" } internal val ob2 = object { val name: String = "Kotlin" } private fun privateBar()=object { val name:String="Java" } fun publicBar()=object { val name:String="Java" } fun test(){ //ob1是private對(duì)象表達(dá)式,編譯器可識(shí)別它的真實(shí)類型 println(ob1.name) //ob2是非private對(duì)象表達(dá)式,編譯器當(dāng)它是Any類型 // println(ob2.name) //privateBar是private函數(shù),編譯器可識(shí)別它返回的對(duì)象表達(dá)式的真實(shí)類型 println(privateBar().name) //publicBar是非private函數(shù),編譯器將它返回的對(duì)象表達(dá)式當(dāng)成Any類型 // println(publicBar().name) } } fun main(args: Array<String>) { ObjectExprType().test() }
輸出結(jié)果:
Kotlin
Java
Kotlin編譯器可以識(shí)別private對(duì)象表達(dá)式的真實(shí)類型。
Kotlin的對(duì)象表達(dá)式可訪問或修飾其作用域內(nèi)的局部變量。
fun main(args: Array<String>) { var a = 20 var obj = object { fun change() { println("change()方法修改變量a的值") a++ } } obj.change() println(a) }
輸出結(jié)果:
change()方法修改變量a的值
21
Kotlin的對(duì)象表達(dá)式比Java的匿名內(nèi)部類增強(qiáng)了三個(gè)方面:
- 對(duì)象表達(dá)式可指定多個(gè)父類型
- Kotlin編譯器能更準(zhǔn)確地識(shí)別局部范圍內(nèi)private對(duì)象表達(dá)式的類型。
- 對(duì)象表達(dá)式可訪問或修改其所在范圍內(nèi)的局部變量
二、對(duì)象聲明和單例模式
對(duì)象聲明的語(yǔ)法格式如下:
object ObjectName [: 0~N個(gè)父類型]{ //對(duì)象表達(dá)式的類體部分 }
對(duì)象聲明與對(duì)象表達(dá)式的語(yǔ)法很相似,區(qū)別在于:對(duì)象表達(dá)式在object關(guān)鍵字后沒有名字;而對(duì)象聲明需要在object關(guān)鍵字后指定名字。
兩者還有如下區(qū)別:
- 對(duì)象表達(dá)式是一個(gè)表達(dá)式,可以被賦值給變量;而對(duì)象聲明不是表達(dá)式,不能用于賦值。
- 對(duì)象聲明可包含嵌套類,不能包含內(nèi)部類;而對(duì)象表達(dá)式可包含內(nèi)部類,不能包含嵌套類。
- 對(duì)象聲明不能定義在函數(shù)和方法內(nèi);但對(duì)象表達(dá)式可嵌套在其他對(duì)象聲明或非內(nèi)部類中。
package `0705` interface Outputable { fun output(msg: String) } abstract class Product(var price: Double) { abstract val name: String abstract fun printInfo() } //指定一個(gè)父類型的對(duì)象表達(dá)式 object MyObject1 : Outputable { override fun output(msg: String) { for (i in 1..6) { println("<h${i}>${msg}</h${i}>") } } } //指定零個(gè)父類型的對(duì)象表達(dá)式 object MyObject2 { //初始化塊 init { println("初始化塊") } //屬性 var name = "Kotlin" //方法 fun test() { println("test方法") } //只能包含嵌套類,不可以包含內(nèi)部類 class Inner } //指定兩個(gè)父類型的對(duì)象表達(dá)式 object MyObject3 : Outputable, Product(1.23) { override fun output(msg: String) { println("輸出信息:${msg}") } override val name: String get() = "激光打印機(jī)" override fun printInfo() { println("高速極光打印機(jī)們支持自動(dòng)雙面打??!") } } fun main(args: Array<String>) { MyObject1.output("一起來(lái)學(xué)Kotlin") println("-----------------------------------------------") println(MyObject2.name) MyObject2.test() println("-----------------------------------------------") println(MyObject3.name) MyObject3.output("Kotlin真不錯(cuò)") MyObject3.printInfo() }
輸出結(jié)果:
<h1>一起來(lái)學(xué)Kotlin</h1>
<h2>一起來(lái)學(xué)Kotlin</h2>
<h3>一起來(lái)學(xué)Kotlin</h3>
<h4>一起來(lái)學(xué)Kotlin</h4>
<h5>一起來(lái)學(xué)Kotlin</h5>
<h6>一起來(lái)學(xué)Kotlin</h6>
-----------------------------------------------
初始化塊
Kotlin
test方法
-----------------------------------------------
激光打印機(jī)
輸出信息:Kotlin真不錯(cuò)
高速極光打印機(jī)們支持自動(dòng)雙面打印!
對(duì)象聲明專門用于實(shí)現(xiàn)單例模式,對(duì)象聲明所定義的對(duì)象也就是該類的唯一實(shí)例,程序可通過(guò)對(duì)象聲明的名稱直接訪問該類的唯一實(shí)例。
三、伴生對(duì)象和靜態(tài)成員
在類中定義的對(duì)象聲明,可使用companion修飾,這樣該對(duì)象就變成了伴生對(duì)象。
每個(gè)類最多只能定義一個(gè)伴生對(duì)象,伴生對(duì)象相當(dāng)于外部類的對(duì)象,程序可通過(guò)外部類直接調(diào)用伴生對(duì)象的成員。
package `0705` interface CompanionTest { fun output(msg: String) } class MyClass { //使用companion修飾的伴生對(duì)象 companion object MyObject1 : CompanionTest { val name = "name屬性值" override fun output(msg: String) { for (i in 1..6) { println("<h${i}>${msg}</h${i}>") } } } } fun main(args: Array<String>) { //使用伴生對(duì)象所在的類調(diào)用伴生對(duì)象的方法 MyClass.output("Kotlin必須學(xué)") println(MyClass.name) }
輸出結(jié)果:
<h1>Kotlin必須學(xué)</h1>
<h2>Kotlin必須學(xué)</h2>
<h3>Kotlin必須學(xué)</h3>
<h4>Kotlin必須學(xué)</h4>
<h5>Kotlin必須學(xué)</h5>
<h6>Kotlin必須學(xué)</h6>
name屬性值
伴生對(duì)象的主要作用就是為其所在的外部類模擬靜態(tài)成員,但只是模擬,伴生對(duì)象的成員依然是伴生對(duì)象本身的實(shí)例成員,并不屬于伴生對(duì)象所在的外部類。
四、伴生對(duì)象的擴(kuò)展
伴生對(duì)象也可以被擴(kuò)展。如果一個(gè)類具有伴生對(duì)象,則Kotlin允許為伴生對(duì)象擴(kuò)展方法和屬性。
package `0705` interface CompanionTest { fun output(msg: String) } class MyClass { //使用companion修飾的伴生對(duì)象 companion object : CompanionTest { val name = "name屬性值" override fun output(msg: String) { for (i in 1..6) { println("<h${i}>${msg}</h${i}>") } } } } //為伴生對(duì)象擴(kuò)展方法 fun MyClass.Companion.test() { println("為伴生對(duì)象擴(kuò)展的方法") } val MyClass.Companion.foo get() = "為伴生對(duì)象擴(kuò)展的屬性" fun main(args: Array<String>) { //使用伴生對(duì)象所在的類調(diào)用伴生對(duì)象的方法 MyClass.output("Kotlin必須學(xué)") println(MyClass.name) //通過(guò)伴生對(duì)象所在的類調(diào)用為伴生對(duì)象擴(kuò)展的成員 MyClass.test() println(MyClass.foo) }
輸出結(jié)果:
<h1>Kotlin必須學(xué)</h1>
<h2>Kotlin必須學(xué)</h2>
<h3>Kotlin必須學(xué)</h3>
<h4>Kotlin必須學(xué)</h4>
<h5>Kotlin必須學(xué)</h5>
<h6>Kotlin必須學(xué)</h6>
name屬性值
為伴生對(duì)象擴(kuò)展的方法
為伴生對(duì)象擴(kuò)展的屬性
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Android自定義View實(shí)現(xiàn)投票進(jìn)度條
欄 目:Android
下一篇:Android自定義View實(shí)現(xiàn)點(diǎn)贊控件
本文標(biāo)題:Kotlin中的對(duì)象表達(dá)式和對(duì)象聲明的具體使用
本文地址:http://mengdiqiu.com.cn/a1/Android/9071.html
您可能感興趣的文章
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10如何使用Flutter實(shí)現(xiàn)58同城中的加載動(dòng)畫詳解
- 01-10Kotlin 擴(kuò)展函數(shù)和擴(kuò)展屬性的使用方法
- 01-10android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語(yǔ)言(中日英切換)
- 01-10Kotlin之在Gradle中無(wú)參(no-arg)編譯器插件的使用詳解
- 01-10聊一聊Android中的StateListAnimator
- 01-10使用kotlin協(xié)程提高app性能(譯)
- 01-10擁抱kotlin之如何習(xí)慣使用kotlin高階函數(shù)
- 01-10Kotlin如何安全訪問lateinit變量的實(shí)現(xiàn)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實(shí)現(xiàn)雙擊返回鍵退出應(yīng)用實(shí)現(xiàn)方
- 01-10android實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- 01-10android實(shí)現(xiàn)記住用戶名和密碼以及自動(dòng)
- 01-10C++自定義API函數(shù)實(shí)現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實(shí)現(xiàn)代
- 01-10android實(shí)現(xiàn)指紋識(shí)別功能
- 01-10如何給Flutter界面切換實(shí)現(xiàn)點(diǎn)特效
- 01-10Android實(shí)現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置