18:kotlin 类和对象 -- 数据类(Data classes)

这篇具有很好参考价值的文章主要介绍了18:kotlin 类和对象 -- 数据类(Data classes)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据类是其主要目的是保存数据的类。数据类会自动附带额外的成员方法

使用data声明一个数据类

data class User(val name: String, val age: Int)

编译器会自动从主构造函数中声明的所有属性派生以下成员

  • .equals()/.hashCode()

  • .toString() 如:"User(name=John, age=42)"

  • .componentN() (在后边的文章会讲到)

  • .copy()

为了确保生成的代码的一致性和有意义的行为,数据类必须满足以下要求

  • 主构造函数必须至少有一个参数
  • 所有主构造函数参数必须标记为 val var
  • 数据类不能是抽象的(abstract),开放的(open)(数据类不能被继承),密封的(sealed), 或者内部的(inner)

数据类成员的生成遵循以下规则,涉及成员的继承:

  • 如果在数据类中有 .equals().hashCode().toString() 的显式实现,或者在超类中有这些方法的最终实现,则不会生成这些方法,而是使用现有的实现
  • 如果父类(超类型)有 .componentN() 方法,并且这些方法是open的,同时返回的类型与数据类兼容,那么数据类会为这些方法生成相应的实现,并覆盖超类型的方法。如果由于不兼容返回值或者使用final修饰而导致超类型的方法无法被覆盖,则会报告错误。
  • 不允许为 .componentN() .copy() 方法提供显式实现。

在JVM上如果需要一个无参构造函数,需要给主构造函数的参数指定默认值

data class User(val name: String = "", val age: Int = 0)

类主体中声明的属性

编译器仅在自动生成的函数中使用主构造函数内定义的属性。要从生成的实现中排除某个属性,请将其声明在类体内

data class Person(val name: String) {
    var age: Int = 0
}

在这个例子中,只有 name属性可以在 .toString().equals().hashCode().copy() 的实现中使用,而且只有一个名为 .component1() 的分量函数。age 属性不能在这些实现中使用,因为它是在类体内声明的。如果两个 Person 对象具有不同的年龄但相同的名称,那么它们会被视为相等。这是因为.equals()函数只能检查name属性的相等性。

fun main() {
    val person1 = Person("John")
    val person2 = Person("John")
    person1.age = 10
    person2.age = 20
    println("person1 == person2: ${person1 == person2}") // person1 == person2: true
    println("person1 with age ${person1.age}: ${person1}") // person1 with age 10: Person(name=John)
    println("person2 with age ${person2.age}: ${person2}") // person2 with age 20: Person(name=John)
}

拷贝

使用.copy()函数来复制一个对象,允许您更改其中一些属性而保持其余部分不变。对于 User 类的.copy()函数实现如下

data class User(val name: String = "", val age: Int = 0)
// fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

fun main() {
    val user = User("John")
    val copy = user.copy(age = 2)
    println(user)   // User(name=John, age=0)
    println(copy)   // User(name=John, age=2)
}

数据类和解构声明

为数据类生成的分量函数(Component functions)使得可以在解构声明(destructuring declarations)中使用它们

fun main() {
    val jane = User("Jane", 35)
    val (name, age) = jane
    println("$name, $age years of age") // Jane, 35 years of age
}

结构函数依赖于.componentN()方法,因此只有在主构造函数中的参数才能使用结构函数

标准数据类

标准库提供了PairTriple类。然而,在大多数情况下,使用具有命名属性的数据类是更好的设计选择,因为它们通过为属性提供有意义的名称使代码更易读。
作者文章来源地址https://www.toymoban.com/news/detail-773103.html

到了这里,关于18:kotlin 类和对象 -- 数据类(Data classes)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin学习 - 类和对象

    类定义 使用Java定义一个 Person 类,代码如下: 使用Kotlin来定义这个类 新建对象代码: 属性field、setter、getter 针对类中定义的每个属性,Kotlin都会产生一个 field ,一个 getter ,和一个 setter (只读属性没有 setter 方法), field 用来存储属性性的数据,无法直接定义 field 。Ko

    2024年02月10日
    浏览(23)
  • 【C++】类和对象 - 封装 - 属性和行为,访问权限,class 和 struct区别,成员属性私有化

    No. Contents 1 【C++】基础知识 - HelloWorld,注释,变量,常量,,标识符 2 【C++】数据类型 - 整型,sizeof,实型,字符型,转义字符,字符串类型,布尔类型,数据的输入 3 【C++】运算符 - 算术运算符,赋值运算符,比较运算符,逻辑运算符 4 【C++】程序流程结构 - 循序结

    2024年02月07日
    浏览(35)
  • 【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】二、入门知识讲解 (引用、内联函数、auto、基于范围的for循环、指针空值

    2024年02月04日
    浏览(31)
  • Kotlin基础(七):数据类和封闭类

    本文主要讲解kotlin数据类(DataClass)和封闭类(SealedClasses),包括使用数据类,对象复制,数据类成员的解构,使用封闭类,以及数据类和封闭类在Android开发中的应用。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 Kotlin提供了许多简洁、安全和表达性强的语法特性。其中

    2024年02月16日
    浏览(24)
  • C++类和对象----封装(观看黑马教程整理的笔记)

    C++面向对象的三大特性为:封装、继承、多态 C++认为万事万物都皆为对象,对象上有其属性和行为 例如: ​ 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… ​ 车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、

    2024年02月11日
    浏览(28)
  • Kotlin 1.9 新特性预览:data object (数据单例)

    data object (数据单例) 是 Kotlin 1.9 中预定引入的新特性 ,但其实从 1.7.20 开始就可以预览了。启动预览需要在 gradle 中升级 KotlinCompileVersion: 接下来让我们看看它有哪些特点。 data object 相对于普通 object ,在调用 toString() 的时候,前者的可读性更好,输出类名,不再携带 HashC

    2024年02月12日
    浏览(30)
  • C++ 语言类 (class) 和抽象数据类型 (abstract data type)

    在 C++ 语言中,我们使用类定义自己的数据类型。通过定义新的类型来反映待解决问题中的各种概念,从而使得程序更加简洁旦易于修改。数据抽象能帮助我们将对象的具体实现与对象所能执行的操作分离开来。 类的两项基本能力:一是数据抽象,即定义数据成员和函数成员

    2023年04月10日
    浏览(24)
  • Java零基础手把手保姆级教程_类和对象(超详细)

    1.1 类和对象的理解 客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合 简单理解:类就是对现实事物的一种描述 类的组成 属性:

    2024年02月05日
    浏览(31)
  • Kotlin中特性、数据类、伴生对象、顶层函数

    在 Kotlin 中,函数参数和属性有不同的声明方式和行为。这些特性使得 Kotlin 代码更加安全、易于理解和维护。 函数参数的只读性 在 Kotlin 中,函数参数默认是只读的。这意味着在函数体内无法直接修改函数参数的值。如果尝试在函数内部修改函数参数,编译器会报错。 这种

    2024年02月09日
    浏览(33)
  • vue3基础(五)watch(浅监听及深度监听),鼠标及键盘修饰符,v-model,对象写法,class使用数组,字符串模版,自定义组件标签上添加事件无效,使用data时用别名替代,solt输出内容

    监听中的 方法名 与 需要监听的 变量名 一致 如果没有(例如aa), 不会报错 ,但监听不到 所以上图会 输出1 ,而不会输出2 newValue改变后的值,oldValue改变前的值 watch 可以监听 computed 计算属性中的方法,变量等等 点击go按钮,调用change方法修改kk的值,computed中有kk,所以

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包