文章目录
定义
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
方法冲突的方法(方法名、参数和返回值类型都相同)。