系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
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. hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】

    题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html  ...

  2. Centos7硬盘空间扩容(vmware虚拟机)

    1. 查看系统挂载点 df -h 2. 系统关机 init 0 硬盘1空间修改为100G,保存并启动 3.查看磁盘 fdisk -l /dev/sda空间加上去了 3. 硬盘分区 fdisk /dev ...

  3. KMP字符串匹配模板

    题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如果你不知道这是什么意思也不要问,去百度 ...

  4. jQuery file upload测试

    <input id="fileupload" type="file" name="files[]" data-url="Ha ...

  5. 洛谷P1120 小木棍 [数据加强版](搜索)

    洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...

  6. django中的url控制

    1.django中的第一个控件:url控制  (路由分发) urls.py:请求路径与视图函数的之间的关系 步骤: 1.首先是要配置环境,   2.其次就是引路径   3.在视图的文件夹里面写相应的函 ...

  7. leetcode 78. 子集(c++)

    给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3]输出:[ [3],  [1],  [2],  ...

  8. Java 类装载器工作机制

    类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在java中,类装在器把一个类装入JVM中,要经过以下几个步骤: 1.装载:查找和导入Class文件 2链接:执行校验,准备和解析步 ...

  9. vue-wacth监听事件

    2019-08-05   0:20 Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化. 以下实例通过使用 watch 实现计数器:(此时我就想了一下,好像绑定点击事件,也 ...

  10. [转]Scikit-learn使用总结

    1 scikit-learn基础介绍 1.1 估计器(Estimator) 估计器,很多时候可以直接理解成分类器,主要包含两个函数: fit():训练算法,设置内部参数.接收训练集和类别两个参数. p ...