文章目录
定义
Kotlin 数据类可以用于存储数据(当然,不是说普通类不行)。数据类使用data class定义:
kt
data class Book(val name: String, val author: String)
数据类必须有主构造方法,括号中只能定义由val或var修饰的成员变量,至少要有一个。
数据类不能用这些修饰符修饰: abstract、open、sealed、inner。
编译器自动重写、生成方法
我们可以再定义一个普通类class,对比一下:
kt
data class Book(val name: String, val author: String)
class User(val name: String, val password: String)
对于声明为data class的类,会重写或生成以下方法:
-
equals和hashCode。数据类的equals方法会对比每一个成员变量是否相对(我们平时使用==,其实就是去调用对象的equals方法),hashCode也会根据成员变量生成对应的值。若全相对,也会判定两个对象相对,hashCode也会获取到同样的值:ktfun main() { val book1 = Book("十日终焉", "杀虫队队员") val book2 = Book("十日终焉", "杀虫队队员") val user1 = User("Zhou-Kt", "******") val user2 = User("Zhou-Kt", "******") println(book1 == book2) println(user1 == user2) println("${book1.hashCode()} ${book2.hashCode()}") print("${user1.hashCode()} ${user2.hashCode()}") }true false -1278661368 -1278661368 214126413 396873410 -
toString。数据类的toString方法生成的字符串会比普通类更易于阅读(print会调用toString生成字符串,再输出):ktfun main() { println(Book("十日终焉", "杀虫队队员")) print(User("Zhou-Kt", "******")) }Book(name=十日终焉, author=杀虫队队员) User@6f539caf -
componentN(N为整数)。会生成一系列的方法,每一个方法都会按顺序获取到对应成员变量的值:ktfun main() { val book = Book("十日终焉", "杀虫队队员") val (name, author) = book print("《${book.component1()}》作者:${book.component2()}") }《十日终焉》作者:杀虫队队员这一特性可以用于解构声明:
ktfun main() { val book = Book("十日终焉", "杀虫队队员") val (name, author) = book print("《$name》作者:$author") }《十日终焉》作者:杀虫队队员 -
copy。该方法可以在原对象的基础上生成一个新对象,并且可以指定某一成员属性与原对象不同:ktfun main() { val book = Book("十日终焉", "未知") val newBook = book.copy(author = "杀虫队队员") println(book) print(newBook) }Book(name=十日终焉, author=未知) Book(name=十日终焉, author=杀虫队队员)
Note:如果数据类中已经声明了这些方法,则不会再生成。数据类中不能声明与
componentN或copy方法冲突的方法(方法名、参数和返回值类型都相同)。