Kotlin面向对象 (5)✔️数据类

  • 数据类声明, data 关键字
  • copy函数使用
  • 数据类解构
  • 提示: Any 是 kotlin 所有类的根类,kotlin 中所有的类都直接或间接的继承 Any 类。

作为数据类型,往往要重写 equalshashCodetoString;虽然不是很麻烦,但当有很多属性时,代码量还是会很多,kotlin 语言设计中考虑到这一点,为此提供了一种数据类 (Data Classes)

一、数据类声明, data 关键字

数据类声明很简单,只需要在类头 class 前面加上 data 关键字。

data class 类名(属性...)

例如:

data class User(val name: String, var password: String)
  • 添加 data 关键字后 User 类变成了数据类,事实上他的底层会重写 Any 的三个函数,并增加一个 copy 函数。equals 函数的重写就是如所有属性全部相等, equals 才返回 true

提示:使用 data 声明数据类的主构造函数中,参数一定要声明为 valvar,不能省略。

二、copy函数使用

数据类中提供了一个 copy 函数,通过 copy 函数可以复制一个新的数据类对象。

fun main(args: Array) {
    val user1 = User("小三", "123")

    val user2 = user1.copy(name = "小四")
    val user3 = user1.copy()

    println(user1 == user2)     // false
    println(user1 == user3)     // true

    println(user1.toString())   // User (name=小三, password=123)
    println(user2.toString())   // User (name=小四, password=123)
    println(user3.toString())   // User (name=小三, password=123)

    println(user1.hashCode())   // 81083983
    println(user2.hashCode())   // 2662763
    println(user3.hashCode())   // 81083983
}

三、数据类解构

数据对象是一个数据容器,可以理解为多个相关数据被打包到一个对象中。结构则进行相反的操作,是将数据对象拆开,然后将内部的属性取出,赋值给不同的变量。结构不仅仅适用于数据对象,也适用于集合对象。

fun main(args: Array) {
    val user1 = User("小三", "123")

    val(name1, pwd1) = user1
    println(name1)  // 小三
    println(pwd1)   // 123

    val(name2, _) = user1   // 省略解构 password 1️⃣
    println(name2)  // 小三

    val(name3) = user1  // 2️⃣
    println(name3)  // 小三
}

代码第1️⃣2️⃣行也是对 user1 对象进行解构,其中第1️⃣行代码中的下划线 _ 代表不需要结构第二个属性值;而代码第2️⃣行只有一个 name3,对于这种解构参数小于数据类属性个数的情况,解构规则按照数据类构造属性顺序解构。

你可能感兴趣的:(Kotlin面向对象 (5)✔️数据类)