kotlin

Kotlin

数据类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//数据类 - data class
//lombok
/**
* 数据类需要满足如下要求:
* 1.主构造方法至少要有一个参数
* 2.所有的主构造方法参数都需要被标记为var或者val
* 3.数据类不能是抽象的,open的,sealed的以及inner的
*
* 对于数据类,编译器会自动生成如下内容:
* 1.equals/hashCode对
* 2.toString()方法,形式为Person(name=zhangsan, age=20, address=beijing)
* 3,针对属性的componentN方法,并且按照属性的声明顺序来生成的
*
* 关于数据类成员的继承要点:
* 1.如果数据类中显式的定义了equals,hashcode或是toString方法,或是在数据类的父类中将这些方法声明为final,那么这些方法就不会再生成,转而使用已有的。
* 2.如果父类拥有componentN方法,并且是open的以及返回的兼容类型,那么编译器就会在数据类中生成相应的componentN方法,并且重写父类的这些方法;
* 如果父类中的这些方法由于不兼容的签名或是被定义为final的,那么编译器就会报错。
* 3.在数据类中显式提供componentN方法以及copy方法是不允许的。
*
* 结构声明
* 在主构造方法中有多少个参数,就会一次生成对应的component1(),component2(),component3()...
* 这些方法返回的就是对应字段的值,componentNf方法使用是实现结构声明的。
*/
data class Person(val name:String,var age:Int,var address: String)
/**
* 在jvm平台上,如果生成的类需要拥有无参构造方法,那么多需要为所有属性制定默认值
*/
data class Person2(val name:String = "",var age:Int = 0,var address: String = "tianjing")
fun main(args: Array<String>) {
var person:Person = Person("zhangsan",20,"beijing")
println(person)
person.age = 18
println(person)
var person2: Person = person.copy(address = "hangzhou")
println(person2)
var (name,age,address) = person
println("$name,$age,$address")
}