Kotlin數據類詳解

數據類(data class)

數據類需要滿足以下要求:

  • 主構造函數至少有一個參數
  • 所有的主構造方法參數都需要被標記爲val或者var
  • 數據類不能是抽象的、open的、sealed的以及inner的。

對於數據類,編譯器會自動生成如下內容:

  • equals/hashcode
  • toString()方法,形成爲Person(name=…,age=…,address=…)
  • 針對屬性的componentN方法,並且按照屬性的聲明順序來生成的

關於數據類成員的繼承要點:

  • 如果數據類中顯式定義了equals/hashcode/toString()方法,或是在數據類的父類中將這些方法聲明爲final,那麼這些方法就不會再生成,轉而使用已有的。
  • 如果父類擁有componentN方法,並且是open的以及返回兼容的類型,那麼編譯器就會在數據類中生成相應的componentN方法,並且重寫父類的這些方法;如果父類中的這些方法由於不兼容的簽名或是被定義final的,編譯器就會報錯。
  • 在數據類中顯式提供componetN方法以及copy方法實現是不允許的。
data class Person(var name:String,var age:Int,var address:String){
}
//在jvm上,如果生成的類需要擁有無參構造方法,那麼就需要爲所有的屬性指定默認值。
data class Person2(val name:String="",val age:Int=20,val address:String="tianjing")
fun main(args: Array<String>) {
    var person=Person("zhangsan",20,"beijing")
    println(person)
    person.age=30
    println(person.age)//30
    val person2=person.copy(address = "chongqing")
    println(person2)//   "zhangsan",30,"chongqing"

    var(name,age,address)=person  //解構聲明
    println("$name,$age,$address")
}

解構聲明:在主構造方法中有多少個參數,就會依次生成對應的component1,component2,component3…在這些方法返回的就是對應字段的值,componentN方法是用來實現解構聲明的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章