iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Mobile Development

Android Kotlin開發 -小嫩雞的30篇精選筆記系列 第 14

Kotlin : Any類別、資料類別、具名引數、多載函式

簡介

今天要介紹一些平常很常見,但你不一定知道他背後原理的一些Kotlin方法或元件,包括Any類別、資料類別、具名引數及多載函式。

Any類別

  • Any類別是所有類別之母:萬物的終極超類別,所有其他類別都是繼承它,包括所有你自己建立的類別,系統都會在幕後讓你繼承Any類別。
  • Any類別讓其他人都繼承它,都能使用它定義的行為,例如它定義了equal函式、hashCode函式、toString函式,讓我們可以直接使用這些函式。

1. equals(any:Any):Boolean

我們日常使用的"=="幕後就是執行equals函式

val w1 = Wolf()
val w2 = Wolf()
println(w1.equals(w2))
//因為w1與w2引用不同的物件,所以印出false

2. hashCode():Int

此函式回傳物件的雜湊碼。雜湊碼通常被用來儲存與取出資料結構的值。
可以把雜湊碼想成桶子上的標籤,系統會把相等的物件放入同一個桶子,之後用雜湊碼來尋找他們。雜湊碼是一種用來縮小搜尋範圍的機制,雜湊碼相同的物件不一定是相等的,但相等的物件一定有相同的雜湊碼。

val w = Wolf()
println(w.hashCode())
//印出523429237

3. toString():String

此函式回傳代表物件的String訊息,包含一個名稱及一串數字。

val w = Wolf()
println(w.toString())
//印出Wolf@1f32e575

資料類別data class

  • 資料類別會自動覆寫它的equals函式、hashCode函式及toString函式。

建立一個data class

data class Recipe(val title:String,
                  val isVegetarian:Boolean)

覆寫後的equals函式,會讓r1==r2是true

val r1 = Recipe("Chicken wings",false)
val r2 = Rwcipe("Chicken wings",false)

它的equals函式,將判斷依據改成根據物件屬性值來判斷物件是否相等,所以此時r1==r2是true,因為它們保存的是相同的資料。而既然兩個物件相等,他們就會有相同的hashCode。

覆寫後的toString函式,會清楚回傳各屬性的值。

val r1 = Recipe("Chicken wings",false)
println(r1.toString())
//印出Recipe(title=Chicken wings,isVegetarian=false)
  • data class提供更多額外功能

功能1: copy函式

val r1 = Recipe("thai curry",false)
val r2 = r1.copy(isVegetarian = true)

複製r1物件,並把素食屬性改為true。此作法能建立物件的新副本,並保持原物件不變。

功能2: 用於解構的component函式

val dataR = Recipe("Chicken wings",false)
val t = r.component1()

r.componentN()可以取得r的第N個屬性值。雖然其實功能與val t = r.title一樣,但是component比較泛用,它可以很容易地解構資料。例如:

你不需要這樣一個一個取出每個屬性

val t = dataR.title
val v = dataR.isVegetarian

只要這樣即可val (t,v) = dataR
意思就是,將dataR的第一個屬性指派給變數t,第二個屬性指派給變數v,也就是傳說中的解構。

BTW, " === " 運算子絕對可以檢查兩個變數是否引用同一個物件,不像"=="會被data class或是其他類別所覆寫掉。

功能3:預設data class的參數!!!(實用!!)

data class Recipe(val title:String,
                  val mainIngredient:String,
                  val is vegetarian:Boolean = false,
                  val difficulty:String = "Easy")

你可以一如往常呼叫它,依序傳值(可以不用傳值給已經有預設值的引數)。

`val r = Recipe("Spaghetti","beef")`

也可以使用具名引數來明確指出哪個屬性使用哪個值,而且不用依照順序傳值!!!!

val r = Recipe(mainIngredient = "Beef",
               title = "Spaghetti")

具名引數也可以用在函式裡面哦

fun  findRecipe(val title:String = "",
                 val mainIngredient:String = "",
                 val is vegetarian:Boolean = false,
                 val difficulty:String = ""):Array<Recipe>{
}
//使用具名引數,沒指定的引數就用預設值
val r = findRecipe(title = "Thai curry")

多載函式

  • 你可以寫出多個名稱相同,但參數相異的函式,稱為多載函式,有點像是雙胞胎,雖然長很像,但他們是兩個不同的個體。

fun addNumbers(a:Int,b:Int):Int{
      return a+b
}
fun addNumbers(a:Double,b:Double):Double{
      return a+b
}

當你用addNumbers(2,5)呼叫函式時,系統會呼叫Int版本的函式。
當你用addNumbers(1.6,2.8)呼叫函式時,系統會呼叫Double版本的函式。

  • 注意事項:
    1.只要引數是不同的,你可以自由改變多載函式的回傳型態。
    2.你不能只改變回傳型態,而不改變引數列,這樣編譯器會以為你想要覆寫函式。

上一篇
Kotlin : higher order function高階函式、lambda表達式、inline function內聯函式
下一篇
Kotlin :建構式與getter、setter用法
系列文
Android Kotlin開發 -小嫩雞的30篇精選筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言