当前位置:嗨网首页>书籍在线阅读

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)