數據類(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方法是用來實現解構聲明的