当前位置: 首页 > news >正文

Kotlin 2.1.0 入门教程(二十一)数据类

数据类

数据类主要用于存储数据。

对于每个数据类,编译器会自动生成一些额外的成员函数,这些函数支持将实例打印为易读的输出、比较实例、复制实例等操作。

数据类使用 data 关键字标记:

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

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

  • equals() / hashCode() 对。

  • 格式为 User(name=John, age=42)toString() 函数。

  • 与属性声明顺序相对应的 componentN() 函数。

  • copy() 函数(详见下文)。

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

  • 主构造函数必须至少有一个参数。

  • 主构造函数的所有参数都必须标记为 valvar

  • 数据类不能是 abstract(抽象的)、open(开放的)、sealed(密封的)或 inner(内部的)。

此外,关于数据类成员的继承,其生成遵循以下规则:

  • 如果数据类主体中有 equals()hashCode()toString() 的显式实现,或者超类中有这些函数的 final 实现,那么不会生成这些函数,而是使用现有的实现。

  • 如果超类型有 open(开放的)且返回兼容类型的 componentN() 函数,那么会为数据类生成相应的函数,并覆盖超类型的这些函数。如果由于签名不兼容或超类型的函数是 final 而无法覆盖,将会报错。

  • 不允许为 componentN()copy() 函数提供显式实现。

数据类可以继承其他类。

open class Person(val name: String) {open fun introduce() {println("My name is $name.")}
}// 定义一个继承自 Person 的数据类。
data class Employee(val id: Int, val name2: String, val department: String) : Person(name2) {override fun introduce() {super.introduce()println("I'm an employee with ID $id, working in the $department department.")}
}fun main() {// 创建 Employee 数据类的实例。val employee = Employee(1, "John", "IT")// My name is John.// I'm an employee with ID 1, working in the IT department.employee.introduce()println(employee) // Employee(id=1, name2=John, department=IT)// 创建另一个相同属性的 Employee 实例。val anotherEmployee = Employee(1, "John", "IT")// 比较两个实例是否相等。println("Are they equal? ${employee == anotherEmployee}") // Are they equal? true
}

JVM 上,如果生成的数据类需要有无参构造函数,那么必须为属性指定默认值:

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

类体中声明的属性

编译器仅会使用主构造函数内定义的属性来自动生成相关函数。若要将某个属性排除在自动生成的实现之外,可在类体中声明该属性:

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

在以下示例中,toString()equals()hashCode()copy() 这些自动生成的实现默认仅使用 name 属性,并且只有一个组件函数 component1()age 属性是在类体中声明的,因此被排除在外。所以,两个 name 相同但 age 值不同的 Person 对象会被视为相等,因为 equals() 方法仅评估主构造函数中的属性:

val person1 = Person("John")
val person2 = Person("John")person1.age = 10
person2.age = 20println("person1 == person2: ${person1 == person2}")
// person1 == person2: trueprintln("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 类,该函数的实现如下:

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

然后你就可以编写如下代码:

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

数据类与解构声明

为数据类生成的组件函数 componentN() 使得数据类可以用于解构声明:

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

标准数据类

标准库提供了 PairTriple 类。不过,在大多数情况下,使用具名数据类是更好的设计选择,因为具名数据类能为属性提供有意义的名称,从而使代码更易读。

相关文章:

Kotlin 2.1.0 入门教程(二十一)数据类

数据类 数据类主要用于存储数据。 对于每个数据类,编译器会自动生成一些额外的成员函数,这些函数支持将实例打印为易读的输出、比较实例、复制实例等操作。 数据类使用 data 关键字标记: data class User(val name: String, val age: Int…...

30天开发操作系统 第 20 天 -- API

前言 大家早上好,今天我们继续努力哦。 昨天我们已经实现了应用程序的运行, 今天我们来实现由应用程序对操作系统功能的调用(即API, 也叫系统调用)。 为什么这样的功能称为“系统调用”(system call)呢?因为它是由应用程序来调用(操作)系统中的功能来完…...

WEB安全--SQL注入--floor报错注入

一、原理: floor()报错注入需要组合count()、rand()、group by()等函数使用,通过一些手段使数据库在处理语句时产生主键重复的报错,从而达到爆出信息的目的 二、内容: ?id-1 or (select 1 from (select count(*),concat(databa…...

【java面向对象的三大特性】封装、继承和多态

目录标题 一、封装(Encapsulation):二、继承(Inheritance):三、多态(Polymorphism):1. 多态的三个必要条件:2.多态的具体实现:3.多态的使用场景&a…...

Hermite 插值

Hermite 插值 不少实际问题不但要求在节点上函数值相等&#xff0c;而且还要求它的导数值相等&#xff0c;甚至要求高阶导数值也相等。满足这种要求的插值多项式就是 Hermite 插值多项式。 下面只讨论函数值与导数值个数相等的情况。设在节点 a ≤ x 0 < x 1 < ⋯ <…...

【推理llm论文精度】DeepSeek-R1:强化学习驱动LLM推理能力飞跃

最近deepseek R1模型大火&#xff0c;正好复习一下他家的技惊四座的论文https://arxiv.org/pdf/2501.12948 近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在推理能力上取得了显著进展&#xff0c;但如何进一步有效提升仍然是研究热点。DeepSeek-AI发布了 DeepS…...

arm linux下的中断处理过程。

本文基于ast2600 soc来阐述&#xff0c;内核版本为5.10 1.中断gic初始化 start_kernel() -> init_IRQ() -> irqchip_init() of_irq_init()主要是构建of_intc_desc. 489-514: 从__irqchip_of_table中找到dts node中匹配的of_table(匹配matches->compatible)&#xf…...

C语言:指针详解

C语言&#xff1a;指针详解 1&#xff1a;指针的基本概念1&#xff1a;什么是指针2&#xff1a;为什么要引入指针3&#xff1a;指针的作用4&#xff1a;指针的类型 2&#xff1a;指针的声明与初始化1&#xff1a; 指针的声明2&#xff1a; 指针的初始化 3&#xff1a;指针的操作…...

github用户名密码登陆失效了

问题&#xff1a; git push突然推代码需要登陆&#xff0c;但是用户名和密码正确输入后&#xff0c;却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…...

【删除tomcat默认管理控制台】

停止Tomcat&#xff1a; ./catalina.sh stop 删除管理控制台应用&#xff1a; 进入Tomcat的webapps目录&#xff1a; cd /path/to/tomcat/webapps List item 删除manager和host-manager文件夹&#xff1a; rm -rf manager host-manager 启动Tomcat&#xff1a; ./catali…...

动态库与静态库:深入解析与应用

在软件开发中&#xff0c;库&#xff08;Library&#xff09;是预编译的代码集合&#xff0c;用于在多个程序之间共享功能。根据链接方式的不同&#xff0c;库主要分为两种类型&#xff1a;静态库&#xff08;Static Library&#xff09; 和 动态库&#xff08;Dynamic Library…...

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D&#xff0c;函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机&#xff08;一台 LVS、两台 RS、一台客户端&#xff09; 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机&#xff08;两块网卡&#xff09; 第一块&#xff1a;NAT模式&#xff08;内网&#xff09; 第二块&#xff1a;添加网卡&am…...

MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制

在matlab APPdesigner中绘图可以用UIAxes组件进行绘图&#xff0c;但是当想多张图时&#xff0c;只能提前绘制图像区域不方便。下面是几种办法&#xff1a; 为了操作可以添加Panl组件&#xff0c;方便操作。 1、当是要求的几个图像大小都是相同时刻采用函数&#xff1a; til…...

9种慢慢被淘汰的编程语言...

技术不断进步&#xff0c;我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响&#xff0c;我们更加关注哪些语言将在未来继续流行&#xff0c;哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场&#xff0c;而其他一些语言则逐…...

vue知识点5

1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...

rdiff-backup备份

目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...

UE_C++ —— Metadata Specifiers

声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词&#xff0c;表示其与引擎和关卡编辑器诸多方面的互动方式&#xff1b; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时&#xff0c;可添加 Metadata Spe…...

【算法与数据结构】并查集详解

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…...

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题&#xff0c;系统导入的数据和线下的EXCEL数据是否一致&#xff0c;如果不一致&#xff0c;如何快速找到差异值&#xff0c;原来脑海第一反应就是使用公…...

抖音批量下载助手:一键获取全系列作品的终极解决方案

抖音批量下载助手&#xff1a;一键获取全系列作品的终极解决方案 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动保存抖音视频而烦恼吗&#xff1f;今天我要向你介绍一款神奇的抖音批量下载助手&…...

云原生安全:零信任架构如何重塑远程办公时代的企业防护

1. 远程办公常态下的云安全挑战与核心思路疫情之后&#xff0c;混合办公从“应急方案”变成了“新常态”。我们面对的早已不是简单的“把办公室电脑搬回家”&#xff0c;而是一个由分布式混合云、多云环境、五花八门的设备&#xff08;公司配发的、员工个人的、移动端的&#x…...

mysql如何实现基于时间点的恢复_使用mysqlbinlog重做日志

<p>要精准定位指定时间点的binlog位置&#xff0c;需用mysqlbinlog解析并人工匹配# at偏移量与TIMESTAMP&#xff0c;避免--start-datetime直接截断导致事务不完整&#xff1b;恢复前须过滤高危语句、验证结构一致性&#xff0c;并考虑GTID、时区、依赖状态等隐含条件。&…...

Proteus 8.13仿真STM32F103R6的ADC采样,数码管显示电压值完整流程(附源码)

Proteus 8.13仿真STM32F103R6的ADC采样与数码管显示实战指南 在嵌入式系统开发中&#xff0c;ADC&#xff08;模数转换器&#xff09;是最常用的外设之一。对于初学者而言&#xff0c;在没有硬件设备的情况下&#xff0c;通过仿真软件学习ADC的使用是快速入门的最佳选择。本文…...

逆变器双环控制器与下垂控制模块:原理、设计与MATLAB实现

逆变器双环控制器与下垂控制模块:原理、设计与MATLAB实现 摘要 随着分布式发电和微电网技术的快速发展,逆变器作为连接分布式电源与电网的关键接口设备,其控制策略直接影响系统的稳定性和电能质量。本文系统阐述了逆变器双环控制器与下垂控制模块的理论基础、设计方法和工…...

WeChatMsg:如何永久保存微信聊天记录并深度分析你的社交足迹?

WeChatMsg&#xff1a;如何永久保存微信聊天记录并深度分析你的社交足迹&#xff1f; 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub…...

在Ubuntu 20.04上搞定Cadence IC617和Calibre 2019:一份给芯片设计新手的保姆级避坑指南

在Ubuntu 20.04上搞定Cadence IC617和Calibre 2019&#xff1a;一份给芯片设计新手的保姆级避坑指南 刚接触芯片设计的同学&#xff0c;第一次在Ubuntu上安装Cadence和Calibre时&#xff0c;往往会遇到各种意想不到的问题。从依赖缺失到许可证配置&#xff0c;从环境变量混乱到…...

如何快速上手Asio:10个简单示例带你掌握C++网络编程

如何快速上手Asio&#xff1a;10个简单示例带你掌握C网络编程 【免费下载链接】asio Asio C Library 项目地址: https://gitcode.com/gh_mirrors/as/asio Asio是一个功能强大的C库&#xff0c;专为网络和底层I/O编程设计&#xff0c;提供了异步操作模型&#xff0c;帮助…...

别再只看K线了!用Python+TA-Lib实战ASI指标,5分钟搞定你的量化选股策略

用PythonTA-Lib实战ASI指标&#xff1a;量化选股策略的5分钟代码实现 在量化交易的世界里&#xff0c;技术指标如同航海图上的坐标&#xff0c;而ASI&#xff08;Accumulation Swing Index&#xff09;指标则是其中一把独特的量尺。不同于传统指标仅关注价格变动&#xff0c;AS…...

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极使用指南

免费解锁AMD Ryzen隐藏性能&#xff1a;SMUDebugTool终极使用指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...