(十三)kotlin物件表示式和物件宣告

2021-08-15 20:19:29 字數 2836 閱讀 5523

kotlin 用物件表示式和物件宣告來實現建立乙個對某個類做了輕微改動的類的物件,且不需要去宣告乙個新的子類。

通過物件表示式實現乙個匿名內部類的物件用於方法的引數中:

window

.addmouselistener

(object

:mouseadapter

()override

fun mouseentered(e

:mouseevent

)})

物件可以繼承於某個基類,或者實現其他介面:

open 

classa(

x:int)

inte***ce

b val ab:a

=object:a

(1),b

如果超型別有乙個建構函式,則必須傳遞引數給它。多個超型別和介面可以用逗號分隔。

通過物件表示式可以越過類的定義直接得到乙個物件:

fun main

(args

:array

<

string

>)

println

(site

.name

)println

(site

.url

)}

請注意,匿名物件可以用作只在本地和私有作用域中宣告的型別。如果你使用匿名物件作為公有函式的 返回型別或者用作公有屬性的型別,那麼該函式或屬性的實際型別 會是匿名物件宣告的超型別,如果你沒有宣告任何超型別,就會是 any。在匿名物件 中新增的成員將無法訪問。

class

c // 公有函式,所以其返回型別是 any

fun publicfoo()=

object

fun bar

()}

在物件表達中可以方便的訪問到作用域中的其他變數:

fun countclicks

(window

:jcomponent

)override

fun mouseentered(e

:mouseevent)})

// ……

}

kotlin 使用 object 關鍵字來宣告乙個物件。

kotlin 中我們可以方便的通過物件宣告來獲得乙個單例。

object

dataprovidermanager

val alldataproviders

:collection

<

dataprovider

>

get()

=// ……

}

引用該物件,我們直接使用其名稱即可:

dataprovidermanager

.registerdataprovider

(……)

當然你也可以定義乙個變數來獲取獲取這個物件,當時當你定義兩個不同的變數來獲取這個物件時,你會發現你並不能得到兩個不同的變數。也就是說通過這種方式,我們獲得乙個單例。

var

data1

=dataprovidermanager

vardata2

=dataprovidermanager

data1

.name

="test"

print

("data1 name = $"

)

object

site

fun main

(args

:array

<

string

>)

輸出結果為:

www

.runoob

.com

www.

runoob

.com

物件可以有超型別:

object

defaultlistener

:mouseadapter

()override

fun mouseentered(e

:mouseevent

)}

與物件表示式不同,當物件宣告在另乙個類的內部時,這個物件並不能通過外部類的例項訪問到該物件,而只能通過類名來訪問,同樣該物件也不能直接訪問到外部類的方法和變數。

class

site

// 錯誤,不能訪問到外部類的方法和變數}}

}fun main

(args

:array

<

string

>)

類內部的物件宣告可以用 companion 關鍵字標記,這樣它就與外部類關聯在一起,我們就可以直接通過外部類訪問到物件的內部元素。

class

myclass

}val instance

=myclass

.create

()// 訪問到物件的內部元素

我們可以省略掉該物件的物件名,然後使用 companion 替代需要宣告的物件名:

class

myclass

}val x

=myclass

.companion

注意:乙個類裡面只能宣告乙個內部關聯物件,即關鍵字 companion 只能使用一次。

請伴生物件的成員看起來像其他語言的靜態成員,但在執行時他們仍然是真實物件的例項成員。例如還可以實現介面:

inte***ce

factory

<

t>

class

myclass

}

物件表示式和物件宣告之間有乙個重要的語義差別:

Kotlin學習 Kotlin物件表示式和物件宣告

kotlin 用物件表示式和物件宣告來實現建立乙個對某個類做了輕微改動的類的物件,且不需要去宣告乙個新的子類 通過物件表示式實現乙個匿名內部類的物件用於方法的引數中 window.addmouselistener object mouseadapter override fun mouseenter...

kotlin條件表示式

衝擊年薪50w,助你高階python工程師 在 kotlin 中,if 是帶有返回值的表示式。因此kotlin沒有三元運算子 condition then else 因為 if 語句可以做到同樣的事。傳統用法 var max a if a b max b 帶 else var max int if ...

Kotlin語法(函式和lambda表示式)

fun double x int int函式引數是用 pascal 符號定義的 name type。引數之間用逗號隔開,每個引數必須指明型別。函式引數可以有預設引數。這樣相比其他語言可以減少過載。fun read b array,off int 0,len int b.size 在呼叫函式時可以引數...