Kotlin征途之data class [数据类]

Kotlin之data class [数据类]

kotlin正常声明一个类的方式class [类名],与java类似

kotlin对类的声明还可以用data关键字来标记那些只用来保存数据的类,将其称之为数据类

eg:

data class User constructor(val name: String) {

    var nickName: String = ""

}

例如上面的user类就是声明的一个数据类

数据类的声明必须满足下列的要求:

  1. 主构造函数至少需要有一个参数

  2. 主构造函数的所有参数必须要标记为val或者var

  3. 数据类不能是抽象、开发、密封或者内部的

为什么data class要有上面的约束呢?

我们来看下声明一个普通的class类,满足上面的要求和不满足上面的要求存在什么差别

```kotlin
class User constructor(name: String) {
}
/** 上述的user类,主构造函数里面的参数name是不带val、var
  * 表示该name仅仅只是作为构造函数的传入参数,该变量仅能在init初始化中获取到
  * 而如果需要将name声明成类变量,需要做如下修改
  */
class User constructor(name1: String) {
    var name: String = ""
    init {
        name = name1
    }
}


//而上述的成员变量的声明可以放到主构造函数上去完成,即
class User constructor(var name: String) {
}

所以上面的限制要求使数据类在主构造函数声明了包含的成员变量,然后编译器通过这些声明的成员变量为我们生成了一些特定的功能。

官方文档也指出:

对于data class编译器自动从主构造函数中声明的所有属性导出以下成员:

  • equals()/hashCode() 对;
  • toString() 格式是 "User(name=John, age=42)"
  • componentN() 函数 按声明顺序对应于所有属性;
  • copy() 函数

也就是data生成的equals、hashCode、toString方法都是根据主构造函数中声明的成员变量来完成对应实现的。

可以看如下例子:

//声明如下的数据类
data class User constructor(var name: String) {
    var nickName: String = ""
}


val user1 = User("Lance")
user1.nickName = "ming"
val user2 = User("Lance")
user2.nickName = "ning"


user1==user2 因为equals、hashCode都是根据name,即此处赋值的Lance去比较的
同时user1、user2的toString方法返回均为User(name=Lance)

如果修改上面的code为

data class User constructor(var name: String, var nickName: String) {
    
}


val user1 = User("Lance", "ming")
val user2 = User("Lance", "ning")

user1!=user2 因为equals、hashCode都是根据name和nickName去比较的
同时user1、user2的toString方法返回分别为User(name=Lance,nickName=ming)User(name=Lance,nickName=ning)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值