data class 是什么?
data class User ( val name: String, val age: Int)
data class 的特点
优势 自动生成重写以下方法:
equals()/hashCode() toString() 例如 User(name=John, age=42) componentN() 来获取对应属性 copy() 功能 限制
构造函数至少需要一个参数 构造函数参数需要标记var或val 数据类不能是抽象的,开放的,密闭的,内部的
copy方法默认是浅拷贝
data class User (
var name: String,
var age: Int,
var childName: ArrayList< String>
) : Serializable
@Test
fun test ( ) {
val user1 = User ( "zy" , 28 , arrayListOf ( "zy1" , "zy2" ) )
val user2 = user1. copy ( )
println ( user1)
println ( user2)
user1. age++
user1. childName. add ( "zy3" )
println ( "改变user1后" )
println ( user1)
println ( user2)
}
打印结果,发现user2中的数组跟着user1一起改变了,浅拷贝
User ( name= zy, age= 28 , childName= [ zy1, zy2] )
User ( name= zy, age= 28 , childName= [ zy1, zy2] )
改变user1后
User ( name= zy, age= 29 , childName= [ zy1, zy2, zy3] )
User ( name= zy, age= 28 , childName= [ zy1, zy2, zy3] )
重写copy函数实现深拷贝
其中所依赖的其他对象也需要重写copy方法 其中所依赖的数组需要调用clone或者toList来进行复制
data class User (
var name: String,
var age: Int,
var childName: ArrayList< String>
) : Serializable {
@Suppress ( "UNCHECKED_CAST" )
fun copy ( ) : User {
return User ( name, age, childName. clone ( ) as ArrayList< String> )
}
}