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