Kotlin学习笔记——数据类

  1. 数据类用关键字data标识
data class User(var name: String, var age: Int)
  1. 编译器自动从数据类的主构造函数中声明的所有属性导出以下成员
  • equals()/hashCode() 对;
  • toString() ,格式为User(name=Marry, age=18)
  • componentN() 函数 按声明顺序对应于所有属性;
  • copy() 函数。
  1. 为了确保生成的代码的一致性以及有意义的行为,数据类必须满足以下要求:
  • 必须要有主构造函数;
  • 主构造函数需要至少有一个参数;
  • 主构造函数的所有参数需要标记为 val 或 var;
  • 数据类不能是抽象、开放、密封或者内部的;
  • (在1.1之前)数据类只能实现接口。
  1. 数据类的成员生成遵循成员继承的这些规则:
  • 如果在数据类体中有显式实现 equals()hashCode()或者 toString(),或者这些函数在父类中有 final 实现,那么不会生成这些函数,而会使用现有函数;
  • 如果超类型具有 opencomponentN() 函数,并且返回兼容的类型, 那么会为数据类生成相应的函数,并覆盖超类的实现。如果超类型的这些函数由于签名不兼容或者是 final 而导致无法覆盖,那么会报错;
  • 从一个已具 copy(……) 函数且签名匹配的类型派生一个数据类在 Kotlin 1.2 中已弃用,并且在 Kotlin 1.3 中已禁用。
  • 不允许为 componentN() 以及 copy() 函数提供显式实现。
  1. 在 JVM 中,如果生成的类需要含有一个无参的构造函数,只要在主构造函数中为所有的属性指定默认值即可。
data class User(var name: String = "", var age: Int = 0)

fun main(args: Array<String>) {
    val u = User() // 数据类定义时,主构造函数所有属性都制定了默认值,那么声明对象时,可以不带参数

    println(u)
}
  1. 在数据类体中可定义属性,不会在自动生成的函数(如:toString()equals()hashCode() 以及 copy())中使用(只有在主构造函数定义的属性才会使用)
data class User(var name: String = "", var age: Int = 0) {
    var addr: String = ""
}

fun main(args: Array<String>) {
    val u = User()

    println(u)
}

以上示例中,自动生成的toString()输出时不带内部声明的addr属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值