首页 Kotlin学习笔记(9) - 数据类
文章
取消

Kotlin学习笔记(9) - 数据类

一、数据类

Kotlin中提供了一种特殊的用于数据存储的类,使用data关键字进行创建

1
data class Person(val name: String, val age: Int)

也可以定义好默认参数,直接使用无参的构造

1
2
data class Point(val x: Int = 0, val y: Int = 0)

数据类会自动为我们生成以下常用方法

  • equals()/hashCode()
  • toString
  • copy()
  • componentN()

数据类必须满足以下条件

  • 主构造函数必须至少有一个参数
  • 所有主要构造函数必须标记为valvar
  • 数据类不能被修饰为 abstract, open, sealed, inner

二、主体中声明属性

编译器仅在主构造函数中定义的属性来自动生成函数,如果想排除某个字段可以直接声明在主体中

1
2
3
data class Person(val name: String) {
    var age: Int = 0
}

想要注意如上定义,如果有两个对象,name相同,age不同,但最终equals()是相同的,因为在生成equals方法时,只会使用中构造函数中的属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20

println("person1 == person2: ${person1 == person2}")
// person1 == person2: true

println("person1 with age ${person1.age}: ${person1}")
// person1 with age 10: Person(name=John)

println("person2 with age ${person2.age}: ${person2}")
// person2 with age 20: Person(name=John)

三、数据类的复制

数据类复制对象时允许去改变某些属性并保持其余属性不变,Person类的copy实现如下

1
2
3
4
5
fun copy(name: String = this.name, age: Int = this.age) = Person(name, age)

//copy并改变age
val jack = Person(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

四、数据类的解构声明

数据类生成的Component functions 函数可以让他使用解构声明

1
2
3
4
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
// Jane, 35 years of age
本文由作者按照 CC BY 4.0 进行授权

Kotlin学习笔记(8) - 扩展

Kotlin学习笔记(10) - 密封类/接口