系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!
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. [POJ1934] Trip

    问题描述 Alice and Bob want to go on holiday. Each of them has planned a route, which is a list of citie ...

  2. FTP错误 [ftp: connect: No route to host] 解决方法

    问题: 昨天在局域网内的两台机器上用ftp命令传文件.因为是新机器所以没安装ftp. 分别在两台机器上安装了ftp的服务端和客户端,并启动了ftp服务器进程. 当用启动ftp连接另一台机器时发生了如下 ...

  3. asp.net文件断点上传

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

  4. MySQL server has gone away 问题解决方法

    问题描述: SQLyog在执行大的sql文件时候,报错,报错日志显示2006 - MySQL server has gone away 解决办法: 在php.ini配置文件的[mysqld]节点下添加 ...

  5. css 实现div内显示两行或三行,超出部分用省略号显示

    一.div内显示一行,超出部分用省略号显示 white-space: nowrap;    overflow: hidden;    text-overflow: ellipsis; 二.div内显示 ...

  6. mui初级入门教程(一)— 小白入手mui的学习路线

    文章来源:小青年原创发布时间:2016-05-15关键词:mui,html5+转载需标注本文原始地址:http://zhaomenghuan.github.io/#!/blog/20160515 写在 ...

  7. java后端发送请求并获取响应

    URL wsUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection(); conn. ...

  8. 【ABAP系列】SAP 后台JOB如何DEBUG

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 后台JOB如何DEBUG ...

  9. ALDS1_1_3_D Areas on the Cross-Section Diagram 遇见了几个有意思的语法问题

    Your task is to simulate a flood damage. For a given cross-section diagram, reports areas of flooded ...

  10. MySQL 查询语句--------------进阶7:子查询

    #进阶7:子查询 /* 含义: 出现在其他语句中的select语句,称为子查询或者内查询 外部的查询语句,称为主查询或外查询 分类: 按照子查询出现的位置: select后面:只支持标量子查询 fro ...