Kotlin的特殊類

2021-09-25 08:39:38 字數 2550 閱讀 6254

一:資料類

1.1:使用

我們經常建立一些資料類來儲存乙個物件的屬性和狀態,在這些類中一些標準的get set函式都是機械推導出來的,在kotlin中這些類被標記為資料類,使用關鍵字data宣告

data class user(val name:string, var age: int)

編譯器自動從資料類主建構函式中的屬性推導出一下成員

equals/hashcode對

tostring格式是「user(name=tian,age=12)"

componentn():函式按宣告順序對應所有屬性

copy能力

資料類中的成員生成遵循成員繼承的規則,

如果資料類中有顯示的實現tostring equals等函式,或者在超類中這些函式有final實現,則不會生產這些函式,而是使用現有函式

不允許對componentn以及copy函式提供顯示實現

如果資料類需要乙個無參建構函式,則主建構函式的所有屬性必須有預設值

data class user(val name: string = 「」, val age: int = 1) //這裡就會有無參建構函式

1.2:在類體中宣告屬性

注意:資料類中自動生產的函式只會用到主建構函式中的引數,如果有在類體中宣告的屬性,則不會用到

data class user(var name: string)

1.3:copy函式

很多時候我們需要改變資料類物件的乙個屬性,而保持其他的不變,我們就可以使用copy函式

var user = user(「tian」, 12)

var olderuser = user.copy(age = 21)

二:密封類

密封類表示有限的類繼承結構,當乙個值為有限集中的型別,而不能有任何其他型別時。可以理解它為列舉類的擴充套件。密封類使用sealed修飾,預設是open的類,

注意:密封類和它的子類都必須宣告在相同的檔案中

sealed class person

object man : person()

object woman : person()

fun test(person: person)

}可以看到這裡的when沒有了else,這是密封類最常用的時候,密封類因為有有限的類繼承結構,所以在使用when時我們可以全部覆蓋密封類的子類,但我們臨時新增乙個子類時,在編譯時when因為沒有全部覆蓋密封類的子類,就會報錯,這樣我們就能在編譯期間查詢到錯誤,更容易使程式健壯

特點:密封類預設是抽象的無法例項化,建構函式預設是private的,

三:巢狀類

類也可以巢狀在其他類中, 無法訪問外部類

class outer

}val demo = outer.nested().foo()

四:內部類

內部類與巢狀類不同為它可以訪問外部類,內部類使用inner標記,內部類會有乙個對外部類的物件引用。

class outer

}val demo = outer.nested().foo() //demo = 1

五:列舉類

:5.1:基本使用

列舉類最基本的用法是實現型別安全的列舉,每個列舉常量都是乙個物件,多個常量用逗號分割

enum class direction

enum class time(var number: int)

5.2:列舉類中的自定義成員

列舉類中也可以有自己的匿名類,相應的方法,以及覆蓋基類的方法,

注意:列舉類內定義任何成員需要跟列舉成員物件用分號隔開

enum class time(val age: int) ,

year(2),

second(3); //在這裡用分號把列舉類成員物件和列舉類內定義的成員分開

abstract fun sign(): time
5.3:列舉類的介面實現

列舉類可以實現介面但不能繼承類,可以為所有列舉類成員物件提供統一的實現,也可以在相應的匿名類中單獨實現,

inte***ce itime

enum class time(val age: int) : itime

},year(2),

second(3);

abstract fun sign(): time

override fun test()

5.4:使用列舉類

列舉類可以使用valueof和values函式來進行訪問

val time = time.valueof(「year」) //根據引數year,從time列舉類中獲取year,傳入的字串就是列舉類物件成員的名字

val times = time.values() //這裡會獲取time列舉類中所有的物件成員,返回的是array型別

for (t in times)

使用enumvalueof和enumvalues函式這兩個函式與上面兩個函式返回的結果是一樣的

enumvalueof(「year」) //使用泛型指定要操作的列舉類,返回值為time

enumvalues() //返回為time的array型別

Kotlin學習 Kotlin列舉類

列舉類最基本的用法是實現乙個型別安全的列舉。列舉常量用逗號分隔,每個列舉常量都是乙個物件 enum class color每乙個列舉都是列舉類的例項,它們可以被初始化 enum class color val rgb int 預設名稱為列舉字元名,值從0開始。若需要指定值,則可以使用其建構函式 en...

kotlin 特殊集合之序列

1.先看段 直觀感受序列的優點,速度快 1 序列操作又稱惰性集合操作,在對集合進行鏈式操作 對映 過濾 變換 不需要像普通集合那樣,每進行一次資料操作都需要開闢新的記憶體儲存中間結果 author hc date 2019 09 25 12 05 fun main args array map su...

Kotlin學習筆記(三) Kotlin密封類

前言 密封類,可以理解為列舉,規定了有限個型別,不可以存在其他型別,但列舉每個列舉常量只存在乙個示例,但是密封類的子類可以有多個示例,所以可以將密封類看做是列舉的拓展,基於列舉,高於列舉,青出於藍而勝於藍。正文密封類和普通類的區別,在於密封類使用了sealed修飾符,雖然密封類也可以有子類,但是所有...