系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
Kotlin学习笔记(1)- 环境配置
Kotlin学习笔记(2)- 空安全
Kotlin学习笔记(3)- 语法
Kotlin学习笔记(4)- 流程控制
Kotlin学习笔记(5)- 类
Kotlin学习笔记(6)- 属性
Kotlin学习笔记(7)- 接口
Kotlin学习笔记(8)- 扩展
Kotlin学习笔记(8)- 扩展(续)
Kotlin学习笔记(9)- 数据类
Kotlin学习笔记(10)- 泛型
Kotlin学习笔记(11)- 内部类和嵌套类
Kotlin学习笔记(12)- 委托
Kotlin学习笔记(13)- 函数式编程
Kotlin学习笔记(14)- lambda

这些天项目比较忙,一直在加班,现在周末了,赶紧把kotlin拿起来,继续学习~

一、定义

在平时的使用中,我们会用到一些类来保持一些数据或状态,我们习惯上成为bean或者entity,也有的定义为model。kotlin中有专门处理这一种类的关键字:data。

data class PersonData(var name : String, var age : Int)

这种由data修饰的类叫做数据类,编译器自动从在主构造函数定义的全部特性中得到以下成员:

  • equals()/hashCode()
  • toString() 格式是 "PersonData(name=PersonData, age=20)"
  • componentN() 方法对应按声明顺序出现的所有属性
  • copy() 方法
如果有某个函数被明确地定义在类里或者被继承,编译器就不会生成这个函数。

上面是官方说法,换成通俗的说就是,如果在数据类里自定义了equals等某个方法,那编译器就不会再去生成它。

总结一下,数据类的定义就是以下几个特点:

  1. 类由关键字data修饰(好像是废话)
  2. 类的构造参数必须由var/val修饰,否则编译不通过
  3. ​编译器会自动生成一些常用方法,你可以自定义它们
  4. 和普通类一样,如果你需要一个无参构造方法,可以将构造方法的参数都设置默认值

二、toString

如果没有自定义的话,编译器会自动生成toString方法,输出格式为类名+参数的顺序值

// 定义数据类和普通类
data class PersonData(var name : String, var age : Int)
class PersonNormal(var name : String, val age : Int) // 分别初始化并进行toString输出
fun test(){
var personD = PersonData("PersonData", 20)
var personN = PersonNormal("PersonNormal", 20) Log.d("test", personD.toString())
Log.d("test", personN.toString())
} // 输出
PersonData(name=PersonData, age=20)
com.study.jcking.weatherkotlin.exec.PersonNormal@26b13e2

三、复制copy

copy方法可以让我们方便的对数据类进行赋值,甚至是有修改的复制。比如我们上面写道的PersonD,如果我们想对它进行赋值,并且将名字改为PersonCopy

var personC = personD.copy("Person Copy")
Log.d("test", personC.toString()) //输出
PersonData(name=Person Copy, age=20)

我们只需要传递我们要修改的部分,编辑器会自动识别。上面的写法大概是这种实现

fun copy(name: String = this.name, age: Int = this.age) = PersonData(name, age)

如果我们的构造参数中有多个参数类型一致,上面的写法会按定义的顺序优先匹配

data class PersonData(var name : String, var age : Int, val sex : String)

var personD = PersonData("PersonData", 20, "male")
var personC = personD.copy("famale") Log.d("test", personC.toString()) // 输出
PersonData(name=famale, age=20, sex=male)

其实很明显的,我们要修改的是sex,也就是第三个参数。这时候需要指定参数名

var personC = personD.copy(sex = "famale")

// 输出
PersonData(name=PersonData, age=20, sex=famale)

OK,完美

四、多声明

多声明,也可以理解为变量映射,这就是编译器自动生成的componentN()方法。

var personD = PersonData("PersonData", 20, "male")
var (name, age) = personD Log.d("test", "name = $name, age = $age") //输出
name = PersonData, age = 20

上面的多声明,大概可以翻译成这样

var name = f1.component1()
var age = f1.component2()

五、序列化

由于我们的项目中,要求所有数据类都序列化,那么在学习kotlin时自然就想到了数据类的序列化问题。在Android Studio上,java的数据类可以通过Parcelable插件自动进行序列化,kotlin中暂时不能用,只能自己实现。实现方法和java中的手动实现基本一致。

data class PersonData(var name : String, var age : Int, val sex : String) : Parcelable{
override fun writeToParcel(p0: Parcel?, p1: Int) {
p0?.writeString(this.name)
p0?.writeInt(this.age)
p0?.writeString(this.sex)
} override fun describeContents(): Int {
return 0
} constructor(source: Parcel) : this(source.readString(), source.readInt(), source.readString()) companion object {
@JvmField val CREATOR: Parcelable.Creator<PersonData> = object : Parcelable.Creator<PersonData> {
override fun createFromParcel(source: Parcel): PersonData {
return PersonData(source)
} override fun newArray(size: Int): Array<PersonData?> {
return arrayOfNulls(size)
}
}
}
}

小礼物走一走,来简书关注我

作者:我爱吃栗子啊
链接:https://www.jianshu.com/p/cc30cf245ef6
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Kotlin学习笔记(9)- 数据类的更多相关文章

  1. Kotlin 学习笔记(一)

    (Kotlin 学习笔记的文档结构基本按照 Java 核心技术一书的目录排列) 基本程序设计结构 数据类型 数字 类型 宽度 Double 64 Float 32 Long 64 Int 32 Sho ...

  2. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  3. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  4. Kotlin——最详细的数据类、密封类详解

    在前面几个章节章节中,详细的讲解了Koltin中的接口类(Interface).枚举类(Enmu),还不甚了解的可以查看我的上一篇文章Kotlin--接口类.枚举类详解.当然,在Koltin中,除了接 ...

  5. ArcGIS案例学习笔记-CAD数据自动拓扑检查

    ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...

  6. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  7. #学习笔记#JSP数据交互

    #学习笔记#JSP数据交互 数据库的使用方式:   当用户在第一个页面的查询框输入查询语句点提交的时候我们是用什么样的方式完成这个查询的? 答:我们通过在第一个页面提交表单的形式,真正的数据库查询时在 ...

  8. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  9. ArcGIS案例学习笔记_3_2_CAD数据导入建库

    ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...

随机推荐

  1. darknet-yolov3使用opencv3.4.8时,undefined reference 'imshow()'、'waitKey()'、'nameWindows()'

    解决办法:暴力卸载 卸载办法:进入到opencv3.4.8的安装目录下:make uninstall 然后重新安装了其他版本的,立马编译通过了.

  2. Callable使用示例

    之前工作中也有使用过Callable,但是却没有使用Thread对象去操作过,今晚 小组培训,涨知识了,现特意记录一下,以免忘记. 先看一下Thread的构造器 可以看到,Thread类并没有提供参数 ...

  3. js中元素更新value页面体现不出来的原因

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. <!DOCTYPE>是什么

    所有浏览器都支持<!DOCTYPE> 概念 是指web浏览器关于页面使用哪个html版本进行编写的指令. 常用DOCTYPE声明 html 5 <!DOCTYPE html> ...

  5. 如何实现全屏遮罩(附Vue.extend和el-message源码学习)

    [Vue]如何实现全屏遮罩(附Vue.extend和el-message源码学习) 在做个人项目的时候需要做一个类似于电子相册浏览的控件,实现过程中首先要实现全局遮罩,结合自己的思路并阅读了(饿了么) ...

  6. JavaScript面向对象初步认识

    一.面向对象初步认识 1.什么是对象? 一句话解释: 万物皆对象 对象是有属性的:用{ }来写入! 2.对象的应用(接口) json 接口简单的说就是后台提供给前端提供数据的,让我们进行渲染! 请求接 ...

  7. 1204C Anna, Svyatoslav and Maps

    题目大意 给你一个有向图和一个路径 让你在给定路径中选出尽量少的点使得新路径的最短路长度和原路径相等 给定路径相邻两点间距离为1 分析 先floyd求出两点间最短路 之后每次对于点i找到所有跟它的最短 ...

  8. 知道css有个content属性吗?有什么作用?有什么应用?

    css的content属性专门应用在 before/after 伪元素上,用来插入生成内容.最常见的应用是利用伪类清除浮动. //一种常见利用伪类清除浮动的代码 .clearfix:after { c ...

  9. day02-Javascript之document.write()方法

    转行学开发,代码100天.——2018-03-18 document.write()方法作为Javascript的常用输出方式,可输出字符串,标签元素,变量等. document.write(&quo ...

  10. _exit和exit的区别

    在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf .fopen .fread .fwrite都在此列,他们也被称作缓冲I/O.其特征是对应每一个打开的文件,都存在一个缓冲 ...