数据类是一个简单的类,用于保存数据/状态并包含标准功能(函数)。
数据类声明
-
data
关键字用于将类声明为数据类。 - 声明数据类必须至少包含一个带有属性参数(val或var)的主构造函数。
- 类不能标记为开放,抽象,密封或内部。
- 该类可以扩展(继承)其他类,它还可以实现其他接口。
示例:
data class Persion(var name: String, var age: String)
fun main(args: Array<String>) {
val persion = Persion("alfred", 28)
println("${persion.name}: ${persion.age}")
}
结果:
alfred: 28
数据类内部函数
Kotlin 中自动生成如下函数,因此数据类消除了反复套用代码。
equals(): Boolean
hashCode(): Int
toString(): String
component() 函数对应的属性
copy()
数据类hashCode()和equals()
- 如果两个对象在 kotlin 中相同,那么它们具有相同的hashCode,我们可以使用
hashCode()
方法获得。 - 如果两个对象的
hashCode()
相等,则equals()
返回true,否则返回false。
data class Person(var name: String, var age: String)
fun main(args: Array<String>) {
val person = Person("alfred", 28)
val user = person
println("person_hashcode ${person.hashCode()} \nuser_hashcode ${user.hashCode()}")
println("${person.equals(user)}")
}
结果:
persion_hashcode -916812346
user_hashcode -916812346
true
数据类copy()
数据类提供了一个copy()方法,用于创建对象的副本(或冒号)。 使用copy()方法,可以更改对象的部分或全部属性。
举个例子
:Person类的对象persion,姓名为alfred 年龄为28。我们创建了另一个名为user的对象person并使用数据类的copy()方法,复制了person对象的姓名。
data class Person(var name: String, var age: String)
fun main(args: Array<String>) {
val person = Person("alfred", 28)
val user = person.copy(age = 11)
println("${user.name} : ${user.age}")
}
结果:
alfred : 11
数据类toString()
data类的toString()方法返回对象的String表示形式。
data class Person(var name: String, var age: String)
fun main(args: Array<String>) {
val person = Person("alfred", 28)
println(person.toString())
}
结果:
Person(name=alfred, age=28)
数据类component()
以上面示例为例,component1()方法返回对象的第一个属性的值,component2()返回第二个属性的值。不过一般不采用这种方式获取属性。
fun main(args: Array<String>) {
val person = Person("alfred", 28)
println(person.component1())
println(person.component2())
}
结果:
alfred
28