一、数据类
Kotlin中提供了一种特殊的用于数据存储的类,使用data
关键字进行创建
1
data class Person(val name: String, val age: Int)
也可以定义好默认参数,直接使用无参的构造
1
2
data class Point(val x: Int = 0, val y: Int = 0)
数据类会自动为我们生成以下常用方法
equals()
/hashCode()
toString
copy()
componentN()
数据类必须满足以下条件
- 主构造函数必须至少有一个参数
- 所有主要构造函数必须标记为
val
或var
- 数据类不能被修饰为
abstract
,open
,sealed
,inner
二、主体中声明属性
编译器仅在主构造函数中定义的属性来自动生成函数,如果想排除某个字段可以直接声明在主体中
1
2
3
data class Person(val name: String) {
var age: Int = 0
}
想要注意如上定义,如果有两个对象,name相同,age不同,但最终equals()
是相同的,因为在生成equals方法时,只会使用中构造函数中的属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20
println("person1 == person2: ${person1 == person2}")
// person1 == person2: true
println("person1 with age ${person1.age}: ${person1}")
// person1 with age 10: Person(name=John)
println("person2 with age ${person2.age}: ${person2}")
// person2 with age 20: Person(name=John)
三、数据类的复制
数据类复制对象时允许去改变某些属性并保持其余属性不变,Person类的copy实现如下
1
2
3
4
5
fun copy(name: String = this.name, age: Int = this.age) = Person(name, age)
//copy并改变age
val jack = Person(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
四、数据类的解构声明
数据类生成的Component functions 函数可以让他使用解构声明
1
2
3
4
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
// Jane, 35 years of age