kotlin Object 關(guān)鍵字

使用場景:
對象聲明是定義單列的一種方式
伴生對象可以持有工廠方法和其他于這個類相關(guān),但在調(diào)試時并不太依賴類實力的方法。他們的成員可以通過類名來訪問
對象表達式用來替代java的匿名內(nèi)部類
(1)單列
特征:對象聲明在定義的時候就立即創(chuàng)建了
也就是在object中創(chuàng)建一個對象,這個對象在外部定義的時候就創(chuàng)建了,除非系統(tǒng)重啟,否則這個對象不會改變
如:
object{
// 這個對象在外部被類被定義的時候就跟著object一起創(chuàng)建,創(chuàng)建后對象不會發(fā)生改變
val allEmployees = arrayListOf<Person>()
}
總結(jié): object 對象都是單列的,包括在object內(nèi)創(chuàng)建的對象和object對象本身
創(chuàng)建格式: object 對象名 : 對象類型
(2)伴生對象
知識點一:關(guān)鍵字 Companion 以Companion 來修飾object使外部類可以直接用 類名 . 方法名 來調(diào)用Object塊內(nèi)的方法
如:

class A{
companion object {
fun bar() {
println("Companion object called")
}
}
}
// 在這個地方就可以使用 A.bar 類名調(diào)用方法名的形式直接調(diào)用被companion修飾的 object “伴生對象” 內(nèi)的方法。

A.bar
Companion object called
知識點二:伴生對象實現(xiàn)工廠模式,伴生對象可以訪問類中的所有private成員,包括private的構(gòu)造方法

// 抽象產(chǎn)品接口
interface Flyable{
fun fly(height :Int)
}
interface Moveable{
fun run(distance:Double)
}
interface Writeable{
fun write(statement:String)
}
// 抽象工廠
abstract class AbstractFactory{
abstract fun createFlyable():Flyable
abstract fun createMoveable() :Moveable
abstract fun createWriteable():Writeable

}
// 具體產(chǎn)品
class Aircraft: Flyable{
override fun fly(height:Int){
println("我是一架客運機,我目前的飛行速度為:height 千米。") } } class Car: Moveable{ override fun run(distance:Double){ println("我是一輛小汽車,我莫倩的時速是:distance/小時")
}
}
class Pan: Writeable{
override fun write(statement:String){
println("我是一直到鋼筆,我剛剛寫下一句:$statement 。")
}
}
// 具體工廠
class User: AbstractFactory{
// 伴生對象
companion object{
fun createAircraft(): Flyable{
return Aircraft()
}
fun createMoveable(): Moveable{
return Car()
}
fun createWriteable(): Writeable{
return Pan()
}
}
}
class Test{
fun test(){
/*
在這里調(diào)用具體工廠獲取引用和實例對象的時候不需要實例化具體工廠的引用,只需要類名. 伴生對象內(nèi)的方法就可以獲取到想要的引用
*/
println(User.createAircraft().fly(123))
println(User.createMoveable().run(12.1))
println(User.createWriteable().write("我喜歡寫字"))
}
}

知識點三:作為普通對象使用的伴生對象,也就是給伴生對象增加一個名稱
如:
class Person(val name: String){
companion object Loader{
fun test(): String = "nihao"
}
}
小貼士:如果java想要訪問Kotlin 中的伴生對象,如果以上面的例子來看可以通過Person.Loder.test 來訪問這個對象,如果伴生對象沒有名字,那就用Companion來代替
知識點四:為伴生對象定義一個擴展對象

class Person(val firstName: String,val lastName: String){
companion object {

}

}
// 使用 類名.companion.擴展對象名 (如果伴生對象有名稱就用名稱代替companion)
fun Person.Companion.fromJSON(jsson: String){}
// 調(diào)用是直接使用 類名.擴展對象名
val p = Person.fromJSON("")

(3)匿名內(nèi)部類
interface objectTest{
fun mouseClicked(e: MouseEvent)
fun moustEntered(e: MouseEvent)
}
class MouseEvent {
//第一種實現(xiàn) 直接重寫到object 修飾的 test 對象內(nèi)
object test: objectTest{
override fun mouseClicked(e: MouseEvent) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun moustEntered(e: MouseEvent) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

}
/* 第二種實現(xiàn) 將匿名內(nèi)部類存儲到一個變量中,同時于java的匿名內(nèi)部類一樣,可以訪問類中創(chuàng)建的局部變量 */
var clickCount = 0
val listener = object : objectTest {
override fun mouseClicked(e: MouseEvent) {
clickCount+=1 // clickCount = clickCount+1
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

    override fun moustEntered(e: MouseEvent) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文是在學(xué)習(xí)和使用kotlin時的一些總結(jié)與體會,一些代碼示例來自于網(wǎng)絡(luò)或Kotlin官方文檔,持續(xù)更新... 對...
    竹塵居士閱讀 3,489評論 0 8
  • object關(guān)鍵字在多種情況下出現(xiàn),其核心理念:將聲明一個類和創(chuàng)建一個實例結(jié)合起來。class 使用場景: 1、對...
    Ryan_Hoo閱讀 517評論 0 0
  • 秋天是收獲的季節(jié),就畫畫果實吧。 今天畫的是芒果,歡迎各位點評指正!
    丹小白閱讀 274評論 0 0
  • 怒,是燒心的火 通紅的雙眼 / 濃煙噴濺 血液 / 歡呼 / 沸騰 / 雀躍 細胞怒吼著 / 燃燒 /...
    文樸閱讀 648評論 22 21
  • 1 記得剛剛讀書的時候,是在六歲。那時的自己一點都不想去學(xué)校,倒不是說學(xué)校不好,也不是不喜歡老師,對,就是窮。窮的...
    陪月亮摘星星閱讀 429評論 21 22

友情鏈接更多精彩內(nèi)容