Kotlin 数据类

news/2025/2/14 7:49:13/

文章目录

  • 定义
  • 编译器自动重写、生成方法

定义

Kotlin 数据类可以用于存储数据(当然,不是说普通类不行)。数据类使用data class定义:

data class Book(val name: String, val author: String)

数据类必须有主构造方法,括号中只能定义由valvar修饰的成员变量,至少要有一个。
数据类不能用这些修饰符修饰: abstractopensealedinner

编译器自动重写、生成方法

我们可以再定义一个普通类class,对比一下:

data class Book(val name: String, val author: String)class User(val name: String, val password: String)

对于声明为data class的类,会重写或生成以下方法:

  1. equalshashCode。数据类的equals方法会对比每一个成员变量是否相对(我们平时使用==,其实就是去调用对象的equals方法),hashCode也会根据成员变量生成对应的值。若全相对,也会判定两个对象相对,hashCode也会获取到同样的值:

    fun main() {val book1 = Book("十日终焉", "杀虫队队员")val book2 = Book("十日终焉", "杀虫队队员")val user1 = User("Zhou-Kt", "******")val user2 = User("Zhou-Kt", "******")println(book1 == book2)println(user1 == user2)println("${book1.hashCode()}  ${book2.hashCode()}")print("${user1.hashCode()}  ${user2.hashCode()}")
    }
    
    true
    false
    -1278661368  -1278661368
    214126413  396873410
    
  2. toString。数据类的toString方法生成的字符串会比普通类更易于阅读(print会调用toString生成字符串,再输出):

    fun main() {println(Book("十日终焉", "杀虫队队员"))print(User("Zhou-Kt", "******"))
    }
    
    Book(name=十日终焉, author=杀虫队队员)
    User@6f539caf
    
  3. componentN(N为整数)。会生成一系列的方法,每一个方法都会按顺序获取到对应成员变量的值:

    fun main() {val book = Book("十日终焉", "杀虫队队员")val (name, author) = bookprint("《${book.component1()}》作者:${book.component2()}")
    }
    
    《十日终焉》作者:杀虫队队员
    

    这一特性可以用于解构声明:

    fun main() {val book = Book("十日终焉", "杀虫队队员")val (name, author) = bookprint("《$name》作者:$author")
    }
    
    《十日终焉》作者:杀虫队队员
    
  4. copy。该方法可以在原对象的基础上生成一个新对象,并且可以指定某一成员属性与原对象不同:

    fun main() {val book = Book("十日终焉", "未知")val newBook = book.copy(author = "杀虫队队员")println(book)print(newBook)
    }
    
    Book(name=十日终焉, author=未知)
    Book(name=十日终焉, author=杀虫队队员)
    

Note:如果数据类中已经声明了这些方法,则不会再生成。数据类中不能声明与componentNcopy方法冲突的方法(方法名、参数和返回值类型都相同)。


http://www.ppmy.cn/news/1465681.html

相关文章

Linux服务器安装anaconda、配置pytorch环境

Linux服务器安装anaconda并配置pytorch环境 Linux服务器安装anaconda下载anaconda安装anaconda验证是否安装成功注意默认python版本 配置pytorch环境新建虚拟环境安装pytorch Linux服务器安装anaconda 下载anaconda 首先进入anaconda网站,根据自己的需要选择一个版…

奇安信_NAC终端安全准入系统(相关问题整理)

奇安信终端安全准入系统 ,下称NAC 一、入网控制方式 1.IP流量控制 2.802.1X 准入 需要NAC、交换机、终端 以802.1X 3.DHCP 准入 将NAC作为DHCP服务器,为客户端分配地址,并对分配地址的客户端进行入网管控。 (*)可选 强制入网…

深入理解Vue 3:计算属性与侦听器的艺术

title: 深入理解Vue 3:计算属性与侦听器的艺术 date: 2024/5/30 下午3:53:47 updated: 2024/5/30 下午3:53:47 categories: 前端开发 tags: Vue3计算属性侦听器路由模板性能优化实战案例 前言 Vue 3的新特性简介 Vue.js作为当今流行的前端框架之一,…

WordPress plugin MStore API SQL注入漏洞复现(CVE-2023-3077)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress plugin MStore API 3.9.8 版本之前存在S…

GPT-4o:人工智能新时代的先锋

如何评价GPT-4o? 简介:最近,GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价,包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。提醒:在发布作品前,请把不需要的内容删掉。 方向一:对比分析 提…

Notepad++ 常用

File Edit search view Encoding Language Settings Tools Macro Run Plugins Window 文件 编辑 搜索 视图 编码 语言 设置 工具 宏 运行 插件 窗口 快捷方式 定位行 :CTRL g查找: CTRL F替换&am…

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的,也可以是集群作用域的…

FFmpeg 中 Formats 使用文档介绍

描述 这份文档描述了由libavformat库提供的受支持的格式(复用器和解复用器)。 Formats选项 详细介绍了libavformat库支持的格式(复用器和解复用器)以及相关的全局选项。总结如下: 通用全局选项 avioflags flags:用于控制输入/输出流的缓冲方式,可能的值包括: ‘direct’…