当前位置:网站首页>Kotlin征途之data class [数据类]
Kotlin征途之data class [数据类]
2022-04-23 06:08:00 【Lance_w】
Kotlin之data class [数据类]
kotlin正常声明一个类的方式class [类名],与java类似
kotlin对类的声明还可以用data关键字来标记那些只用来保存数据的类,将其称之为数据类
eg:
data class User constructor(val name: String) {
var nickName: String = ""
}
例如上面的user类就是声明的一个数据类
数据类的声明必须满足下列的要求:
-
主构造函数至少需要有一个参数
-
主构造函数的所有参数必须要标记为val或者var
-
数据类不能是抽象、开发、密封或者内部的
为什么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)
版权声明
本文为[Lance_w]所创,转载请带上原文链接,感谢
https://blog.csdn.net/wsq_tomato/article/details/119420989
边栏推荐
猜你喜欢

组件化学习(1)思想及实现方式

AVD Pixel_ 2_ API_ 24 is already running. If that is not the case, delete the files at C:\Users\admi

oracle undo使用率高问题处理

AVD Pixel_2_API_24 is already running.If that is not the case, delete the files at C:\Users\admi

Android清除应用缓存

iTOP4412 HDMI显示(4.4.4_r1)

Personal blog website construction

双指针仪表盘读数(一)

Dolphinscheduler调度spark任务踩坑记录

BottomSheetDialogFragment 与 ListView RecyclerView ScrollView 滑动冲突问题
随机推荐
Itop4412 cannot display boot animation (4.0.3_r1)
Android清除应用缓存
数据库的事务
PG SQL截取字符串到指定字符位置
Encapsulate a set of project network request framework from 0
Error alarm of Postgres master-slave replication delay monitoring
MySQL笔记4_主键自增长(auto_increment)
统一任务分发调度执行框架
MySQL笔记2_数据表
sys.dbms_scheduler.create_job创建定时任务(功能更强大丰富)
oracle undo使用率高问题处理
ORACLE环境遇到的ORA-600 [qkacon:FJswrwo]
Using queue to realize stack
双指针仪表盘读数(一)
利用队列实现栈
oracle给对象重命名
Bottomsheetdialogfragment conflicts with listview recyclerview Scrollview sliding
ffmpeg常用命令
Cause: dx. jar is missing
实习做了啥