Kotlin学习笔记(9)- 数据类
系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
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等某个方法,那编译器就不会再去生成它。
总结一下,数据类的定义就是以下几个特点:
- 类由关键字
data修饰(好像是废话) - 类的构造参数必须由
var/val修饰,否则编译不通过 - 编译器会自动生成一些常用方法,你可以自定义它们
- 和普通类一样,如果你需要一个无参构造方法,可以将构造方法的参数都设置默认值
二、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)- 数据类的更多相关文章
- Kotlin 学习笔记(一)
(Kotlin 学习笔记的文档结构基本按照 Java 核心技术一书的目录排列) 基本程序设计结构 数据类型 数字 类型 宽度 Double 64 Float 32 Long 64 Int 32 Sho ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- Kotlin——最详细的数据类、密封类详解
在前面几个章节章节中,详细的讲解了Koltin中的接口类(Interface).枚举类(Enmu),还不甚了解的可以查看我的上一篇文章Kotlin--接口类.枚举类详解.当然,在Koltin中,除了接 ...
- ArcGIS案例学习笔记-CAD数据自动拓扑检查
ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- #学习笔记#JSP数据交互
#学习笔记#JSP数据交互 数据库的使用方式: 当用户在第一个页面的查询框输入查询语句点提交的时候我们是用什么样的方式完成这个查询的? 答:我们通过在第一个页面提交表单的形式,真正的数据库查询时在 ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ArcGIS案例学习笔记_3_2_CAD数据导入建库
ArcGIS案例学习笔记_3_2_CAD数据导入建库 计划时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性,管理 问题:CAD存在拓扑错误,标注位置偏移 教程:pdf ...
随机推荐
- [POJ 1390] Blocking
问题描述 Some of you may have played a game called 'Blocks'. There are n blocks in a row, each box has a ...
- 【leetcode】1042. Flower Planting With No Adjacent
题目如下: You have N gardens, labelled 1 to N. In each garden, you want to plant one of 4 types of flow ...
- python学习笔记(十一)处理json
json串就是字符串,json串里必须是双引号 d={'car':{'color':'red','price':100,'count':50}, '爱分叉':{'color':'red','price ...
- NodeJS使用puppeteer进行截图
const puppeteer = require('/home/ordinaryUser_2/automation/NodeJS/node/lib/node_global/lib/node_modu ...
- 【HDOJ6695】Welcome Party(multiset)
题意: n<=1e5,x[i],y[i]<=1e18 思路: #include<bits/stdc++.h> using namespace std; typedef long ...
- 让VirtualBox虚拟机实现开机自动后台运行
转至:http://www.cnblogs.com/top5/archive/2012/01/19/2326234.html 测试环境:Host OS: Windows 7 x64 Guest OS: ...
- p5414 [YNOI2019]排序
分析 这是真正的云南oi/px 我们需要考虑保留一段不降子序列 剩余的自由往前往后移动 所以dp一下即可 代码 #include<bits/stdc++.h> using namespac ...
- VS2017中英文切换
离线安装完成, --fix 检查下是否完整 安装时没有勾选的项, 可以下次再补安装 安装时出现缺少*.vsix 如:microsoft.visualstudio.webtoolsextensions. ...
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...
- 【转载】Spring Boot:常用属性汇总
附录A.常用应用程序属性 摘自:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-pr ...