01-数据类
7.1 数据类
在使用Java开发项目的过程中,经常会定义一个实体类来持久化一些数据或状态,它们被称为bean或者entity,也可以称为model。在Kotlin中,这一类型被称为数据类,使用关键字data标识。
data class User(val name: String, val age: Int)
对于数据类来说,编译器会从主构造函数中根据声明的属性自动获得以下几个函数。
- equals() / hashCode()。
- toString(),输出的字符串格式为User(name=jack, age=30)。
- componentN(),按声明顺序排列对应的属性。
- copy(),可以使用该函数复制对象并修改部分属性。
如果某个函数在类中被明确地定义或者被继承,则编译器就不会生成这个函数。通俗来讲,如果在数据类里自定义了一个equals方法,那么编译器就不会再生成它。为了保证编程器生成代码的一致性,数据类的定义需要满足以下条件。
- 主构造函数至少包含一个参数。
- 所有的主构造函数的参数必须标识为val或者var,否则编译不通过。
- 数据类不可以声明为 abstract、open、sealed或inner类型。
- 数据类不能继承其他类,但是可以实现接口。
和普通的类一样,如果生成的类需要含有一个无参的构造函数,则所有的属性必须指定默认值。代码如下。
data class User(val name: String = "", val age: Int = 0)
对于任何的数据类,如果没有自定义toString方法,编译器会自动生成一个toString方法,输出格式为【类名+参数的值】。代码如下。
fun main(args: Array<String>) {
val jack = User(name = "Jack", age = 1).toString()
println(jack)
}
data class User(val name: String, val age: Int)
运行上面的代码,输出结果如下。
User(name=Jack, age=1)