在 Kotlin 中,有一个 data 关键字,来标记类,这种类一般只用来保存数据,但是数据类必须满足类以下条件:
1. 主构造函数至少有一个参数
2. 主构造函数的参数必须使用 var 或者 val 标记
3. 数据类不能使抽象、开放、密封或者内部的
4. (1.1以前)数据类只能实现接口
data class Demo1(val name:String,val age:Int)
class Demo2(val name:String,val age:Int)
fun main(args: Array<String>) {
val demo1 = Demo1("宋琪飞",20);
println(demo1)
val demo2 = Demo2("宋琪飞",20);
println(demo2)
}
结果:
可以看到,data 类和非 data 类的一点不一样,其实,对于 data 类,编译器会自动从主构造函数的所有属性中导入以下成员:
1. equals() / hashCode() 对
2. toString() 格式 "Demo1(name=宋琪飞,age=20)"
3. copy 函数
copy 函数是为了我们复制一个对象仅仅只改变它的一些属性,其他部分不变时使用的,如下:
data class Demo(val name:String,val age:Int)
fun main(args: Array<String>) {
val demo = Demo("宋琪飞",20)
println(demo)
val demo1 = demo.copy(name = "陈金桁")
println(demo1)
val demo2 = demo.copy(age = 21)
println(demo2)
val demo3 = demo.copy(name = "陈金桁",age = 21)
println(demo3)
}
结果:
注意:如果你的 data 类对于上述函数有具体的实现,或者其父类对这些函数有 final 的实现,那么 data 类就会直接使用现有函数,而不会自动生成。data 类当然也可以在类体中声明属性,只是编译器在自动生成函数时不会使用类中声明的元素。
- 解构声明:我们可以对数据类进行解构,从而得到我们想要的属性:
data class Demo(val name:String,val age:Int)
fun main(args: Array<String>) {
val demo = Demo("宋琪飞",20)
val (name,age) = demo;
println("姓名是$name")
println("年龄是$age")
}
结果: