IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Kotlin征途之data class [数据类] -> 正文阅读

[移动开发]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)
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:57:05  更:2021-08-06 09:58:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 -2025/2/5 22:43:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码