object classClass02 {
/**
* CASE CLASS
* 样例类,相比较于普通的类,它有三点不同
* 1. 在创建对象的时候,可以省略 new
* 2. 默认情况下,属性都是只读的
* 3. 自己自动添加相关的equals、toString等方法
*
* 特别适合用来描述数据。
*/
case class Stu(name:String, age:Int)
def main(args: Array[String]): Unit = {
val stu1 = Stu("小苏", 18)
// 2. 默认情况下,属性都是只读的
// stu1.name = "xxx"
// stu1.age = 19
val stu2 = Stu("小苏", 18)
println(stu1)
println(stu1 == stu2)
val set1 = Set(stu1, stu2)
println(set1)
}
}
- 自动生成
toString():直接打印对象时,输出属性名 + 值(而非默认的内存地址); - 自动生成
equals()和hashCode():基于所有属性进行对象相等性判断(而非引用相等); - 自动生成
componentN()方法:支持解构赋值,快速提取属性; - 自动生成
copy()方法:方便创建对象的拷贝(支持修改部分属性); - 语法简洁:创建对象时可省略
new关键字(Kotlin 通用特性)。
(1)主构造函数必须包含至少一个属性
data class 是为数据而生的,不能定义无参主构造函数(除非所有属性都有默认值):
kotlin
// 错误:主构造函数无属性
// data class EmptyData()
// 正确:所有属性有默认值,支持无参创建
data class User(val id: String = "", val name: String = "未知")
val defaultUser = User() // 可行,属性使用默认值
(2)属性只读 / 可变的选择
- 用
val声明:属性只读(不可修改),推荐用于不可变数据(如接口返回结果); - 用
var声明:属性可变(可修改),适用于需要动态更新的数据(如表单对象)。
kotlin
data class MutableUser(var name: String, val id: String)
val user = MutableUser("小夏", "U1001")
user.name = "小夏同学" // 允许修改(var 修饰)
// user.id = "U1002" // 报错(val 修饰,只读)
(3)与集合的配合
由于 data class 重写了 equals() 和 hashCode(),放入 Set(去重集合)时,会自动根据属性去重: