创建一些类除了保存数据不干其他事情,比如我们解析网络请求下来的数据。Kotlin就提供了一个非常方便的class—— data class,就像上边的栗子
data class Girl(var name:String,var age:Int,var height:Int,var address:String)
在Kotlin中,声明类的同时可以方便的直接声明构造方法等参数,鉴于data class只是存放数据,那么只一个构造方法足矣
编译器会根据我们在构造函数里声明的属性自动导出下列成员:
equals()/hashCode()
toString()方法
componentN()方法
copy()方法
var girl1:Girl = Girl("嫚嫚",29,160,"廊坊")
var girl2:Girl = Girl("嫚嫚",29,160,"廊坊")
println(girl1.equals(girl2))
println(girl1.hashCode())
println(girl1)
如果数据类需要无参构造函数,则所有属性必须有默认值:
data class Girl(var name:String = "",var age:Int = 0,var height:Int = 0,var address:String = "")
var girl3:Girl = Girl()
当要复制一个对象,只改变一些属性,但其余不变,copy()就是为此而生
var girl1: Girl = Girl("嫚嫚", 29, 160, "廊坊")
var girl2: Girl = girl1.copy("二帆")//传递第一参数,第二参数默认
var girl3: Girl = girl1.copy("真真", 28, 168, "福建")//传递所有参数
var girl4: Girl = girl1.copy(age = 30) //命名参数,传递指定参数
println("$girl1,$girl2,$girl3,$girl4")
//结果
Girl(name=嫚嫚, age=29, height=160, address=廊坊),
Girl(name=二帆, age=29, height=160, address=廊坊),
Girl(name=真真, age=28, height=168, address=福建),
Girl(name=嫚嫚, age=30, height=160, address=廊坊)
编译器为数据类(data class)自动声明componentN()函数,可直接用解构声明
var girl1: Girl = Girl("嫚嫚", 29, 160, "廊坊")
var (a,b,c,d) = girl1
println("$a,$b,$c,$d")
==
和三个等号===
Kotlin有两种相等性(equality):
Referential/引用相等(两个引用指向同一对象): ===
(否定形式!==
)
三个等号===
比较,是对象引用(地址),即判断是否同一个对象
Structural/结构相等(用equals()检查): ==
(否定形式!=
)
两个等号==
比较,是通过equals()函数进行比较
var girl1: Girl = Girl("嫚嫚", 29, 160, "廊坊")
var girl2: Girl = Girl("嫚嫚", 29, 160, "廊坊")
var girl3: Girl = Girl("富婆", 30, 158, "贵州")
println(girl1 == girl2) //输出true, 对象数据相同
println(girl2 == girl3) //输出false, 对象数据不同
// girl1,girl2,girl3都是不同对象,即对象引用(地址)不同
println(girl1 === girl2) //输出false, 对象引用(地址)不同
println(girl1 === girl3) //输出false, 对象引用(地址)不同