数据类:data class
在Java中toString()、equals()、hashCode()方法非常熟悉,这是Object基类中的固有方法。重写hashCode()和equals()实现对象之间的比较。toString()方法就更不用说了,如果要打印某个对象,就需要重写toString()再拼凑字符串,很麻烦!
1、数据类
好在Kotlin总结了很多Java开发中的痛点,不必再重写这些基础方法.
1.1、data定义数据类
只需要在类声明class前面添加data修饰符,上面的一些方法就自动生成。必须将要纳入考虑的属性放在数据类的主构造函数中:
class Book(val id: Int, var name: String, var price: Float) {
}1.2、重写的方法
data自动生成了如下几个方法:
equals(): Boolean
hashCode(): Int
toString(): String
component() 函数对应的属性
copy()1.3、示例
创建一个data数据类
class Book(val id: Int, var name: String, var price: Float) {
}创建对象,并打印:
val book = Book(100, "Harry Potter", 33.4f)
println(book)
//打印结果
Book(id=100, name=Harry Potter, price=33.4)创建另一个对象,比较和前一个对象是否相等:
val book2 = Book(100, "Harry Potter", 33.4f)
println(book == book2)
//打印结果
true如果把data数据类修饰符去掉,再运行一遍试试,结果完全不一样
class Book(val id: Int, val name: String, var price: Float)
val book = Book(100, "Harry Potter", 33.4f)
val book2 = Book(100, "Harry Potter", 33.4f)
println(book == book2)
println(book)
//打印结果
false
com.quibbler.kotlin.learn.Book@ccc14b72、注意点
①data类的主构造函数中声明的属性才会被考虑用来生成toString()、equals()等方法
data class Book(val id: Int, var name: String, var price: Float) {
var other = 11
set(value) {
field = value
}
}即使两个对象中的非主构造函数中的属性不一样,数据类比较不会将其考虑在内:
val book = Book(100, "Harry Potter", 33.4f)
val book2 = Book(100, "Harry Potter", 33.4f)
book2.other =99
println(book == book2)
//输出true,即使other属性不一样②数据类必须要有至少一个属性值,不然的话用什么属性来衡量呢?

③主构造函数中的所有参数必须被标记为val或者var。可以用copy()函数创建对象副本并且同时修改某些val属性的值
data class Book(val id: Int, val name: String, var price: Float) {
fun copy(name: String = this.name, price: Float = this.price) = Book(this.id, name, price)
}
//用copy函数创建数据类实例副本
val book = Book(100, "Harry Potter", 33.4f)
val bookOther = book.copy("Kotlin", 4.4f)
println(bookOther)④数据类不能是抽象的,内部的,开放的或密封的。
相关博客:

