Kotlin知识体系(二) : Kotlin的七个关键特性
前言
在Android开发中,Kotlin以其简洁的语法和强大的特性显著提升了开发效率。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开发中的应用。
一、构造函数:主次分明
主构造函数
class User constructor(_name: String) { // 传统写法val name = _name
}class Student(val id: Int, var name: String) // 简化版
主构造函数直接声明在类名后,使用val/var声明参数可自动创建属性
次构造函数
class Person(val name: String) {constructor(name: String, age: Int) : this(name) {println("Secondary constructor: $name, $age")}
}
次构造函数必须委托主构造函数,适用于需要多种初始化方式的场景
二、数据类:样板代码终结者
data class Book(val id: Int, val title: String, var price: Double)
自动生成功能:
• equals()/hashCode()
• toString() 格式:Book(id=1, title=Kotlin Guide, price=39.9)
• copy() 方法实现对象浅拷贝
• 组件函数componentN()支持解构
大多数情况下,自动生成的equals() / hashCode()都是可靠的。
- 对于基本类型(Int、String 等):直接比较值。
- 对于引用类型(其他对象):调用其 equals() 方法。
- 例外:数组(Array)的比较使用 Arrays.equals(),而非内容深度比较。(一维数组使用Arrays.Equals()能够实现深度比较,但二位数组使用Array.Equals不能实现深度比较)
需要干预的场景 :
类体中定义额外属性
- 继承非data class (用组合代替继承)
- 二位数组内容的深度比较(得用deepEquals())
三、单例对象:object关键字
object NetworkManager {private const val TIMEOUT = 5000fun makeRequest(url: String) {println("Requesting $url with timeout $TIMEOUT")}
}// 使用
NetworkManager.makeRequest("https://api.example.com")
替代Java静态方法的最佳实践,初始化时机在首次访问时(线程安全)
四、伴生对象:静态成员的替代方案
class DatabaseClient {companion object {const val VERSION = "1.2.3"fun create(): DatabaseClient = DatabaseClient()}
}// 调用
val client = DatabaseClient.create()
println(DatabaseClient.VERSION)
伴生对象成员可通过类名直接访问,支持实现接口和扩展函数
五、继承与接口:明确开放原则
open class Animal(val name: String) {open fun makeSound() = "Generic animal sound"
}class Dog(name: String) : Animal(name) {override fun makeSound() = "Woof!"
}interface Swimmer {fun swim() {println("Default swimming implementation")}
}
关键点:
• 类/方法默认final,需open允许继承
• override强制要求显式声明重写
• 接口支持默认方法实现
六、属性访问器:精细化控制
class Temperature {var celsius = 0.0var fahrenheitget() = celsius * 9/5 + 32set(value) {celsius = (value - 32) * 5/9}
}val temp = Temperature()
temp.fahrenheit = 68.0
println("${temp.celsius}°C") // 输出20.0°C
通过自定义getter/setter实现:
• 数据格式转换
• 输入有效性验证
• 延迟初始化
• 访问日志记录
七、密封类 vs 枚举类
密封类(Sealed Class)
sealed class Result<out T> {data class Success<T>(val data: T) : Result<T>()data class Error(val exception: Exception) : Result<Nothing>()object Loading : Result<Nothing>()
}fun handleResult(result: Result<Int>) = when(result) {is Result.Success -> println(result.data)is Result.Error -> println(result.exception)Result.Loading -> println("Loading...")
}
优势对比枚举
- 可携带数据(每个子类都能有独立属性)
- 支持继承体系扩展
- 配合when表达式实现穷尽检查
相关文章:
Kotlin知识体系(二) : Kotlin的七个关键特性
前言 在Android开发中,Kotlin以其简洁的语法和强大的特性显著提升了开发效率。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开发中的应用。 一、构造函数:主次分明 主构造函数 class User constructor(_name: String) { //…...
FreeRTOS源码概述
FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中,FreeRTOS 相关的源码如下: 主要涉及2个目录: Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…...
日志统计(C++,模拟,双指针)
题目要我们求在某个时间段中,帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间,升序排序 枚举每一条帖子,枚举后续每一条帖子,如果id相同且时间差小于d,那么就记录起来,如果记录数量cn…...
加固脱壳技术:DEX动态加载对抗
1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程: graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…...
C++之list类(超详细)
在上一节中我们学习了STL中的vector这个容器,这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…...
强化学习的一些概念
目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习(Reinforcement Learning, RL)是机器学习的一个分支,旨在让智能体(Agent)通过与环境的交互学习最优策略,以…...
MambaTab:表格数据处理的新利器
——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab,一种基于结构化状态空间模型(SSM)的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构,MambaTab在普通监督学习和特征增量学习场景中均表现优异&…...
Kafka的流量控制机制
Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统,能够在海量数据场景下提供稳定的消息生产和消费能力,其背后的流量控制机制功不可没。我们需要认识到,Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃,它的目标是实…...
RabbitMQ支持的复杂的消息交换模式
RabbitMQ支持多种复杂的消息交换模式,这些模式通过不同的交换机类型和队列特性实现,能够满足多样化的业务需求。以下是RabbitMQ支持的主要复杂消息交换模式: 1. Direct Exchange(直连交换机) 直连交换机根据消息的路由…...
CSSHTML新特性
HTML5 新特性探秘 在 Web 开发的不断演进中,HTML5 带来了一系列令人振奋的新特性,极大地提升了网页的功能和用户体验。今天,我们就来深入探究一下这些新特性。 语义化标签:让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…...
51单片机的工作方式
目录 一、51 单片机的时钟电路及时钟信号 (一)时钟电路 (二)时钟信号 二、51 单片机的CPU 时序 (一)时钟周期 (二)机器周期 (三)指令周期 三、…...
Java算法OJ(12)
目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖,今天来分享几道的练习题,欢迎大家在评论区多多交流,废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目:斐波那契数列_牛客题霸…...
MrRobot靶机详细解答
一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭,且无其它特殊端口,只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…...
java线性表(单向链表)
对于链表我们有很多种,有带头和不带头,双向和单项,循环和不循环。 我们实现的单向链表是不带头单向不循环链表。 链表不比顺序表,它可以连续也可以不连续,是链子型的每条链子两边都有节点(除首尾)。 单向…...
QT:动态属性和对象树
动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…...
编程语言的几种常见的分类方法
一、 按照编程范式分类 命令式编程语言 强调通过语句来改变程序状态,如 C、Pascal、Fortran 等。 面向对象编程语言 基于对象和类的概念,支持封装、继承和多态,如 Java、C、Python、Ruby 等。 函数式编程语言 注重不可变性和纯函数…...
算法——层序遍历和中序遍历构造二叉树
晴问 #include <iostream> #include <vector> #include <queue> #include <unordered_map>using namespace std;struct TreeNode {int data;TreeNode *left;TreeNode *right;TreeNode(int data) : data(data), left(nullptr), right(nullptr) {} };//…...
中考英语之06语态(动词语态-简单)
1 主动语态和被动语态 在初中英语中,语态是动词的一种形式,用于说明主语与谓语动词之间的关系,主要有主动语态和被动语态两种。 1.1 主动语态 定义:表示主语是动作的执行者。结构:主语 谓语(及物动词&a…...
linux常用基础命令_最新
常用命令 查看当前目录下个各个文件大小查看当前系统储存使用情况查看当前路径删除当前目录下所有包含".log"的文件linux开机启动jar更改自动配置文件后操作关闭自启动linux静默启动java服务查询端口被占用查看软件版本重启关机开机启动取别名清空当前行创建文件touc…...
PH热榜 | 2025-03-16
1. BrowserAgent 标语:基于浏览器的人工智能代理 - 无限使用,固定费用 介绍:在您的浏览器中直接创建和运行AI工作流程,无需支付API费用。我们的可视化编辑器不需要编写代码,同时我们的浏览器本地技术支持以固定价格进…...
《论语别裁》第01章 学而(27) 无所适从的礼俗
下面讲做学问的态度。 有子曰:礼之用,和为贵,先王之道,斯为美,小大由之;有所不行,知和而和,不以礼节之,亦不可行也。 为什么讲学问讲到礼?这个礼,…...
关于进程的实验(子进程和父进程相关的)
文章目录 1.第一个问题2.第二个问题3.第三个问题 1.第一个问题 编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显…...
《基于视频监控的智能跌倒检测系统》开题报告
一、本课题研究目标 本课题旨在研究并实现一个基于视频监控的智能跌倒检测系统,以有效识别老年人或需特殊照顾人群的跌倒事件,并实现自动报警功能。具体而言,该系统将通过机器学习和深度学习技术,对视频数据中的行为模式进行分析&…...
Flask中的装饰器
在 Flask 中,装饰器(Decorator)是一种 Python 语法特性,它允许你在不修改原始函数的情况下,扩展其功能。Flask 使用装饰器来定义路由、请求前后钩子、中间件等。 1. Flask 装饰器的基本概念 Python 的装饰器本质上是一…...
MySQL配置文件my.cnf详解
目前使用的服务器系统是CentOS8.5 ,针对MySql8.4的配置示例,自己根据实际情况修改。 安装MySql8.4时,MySql8.4没有默认的my.cnf,需要用户根据需要自行配置my.cnf文件,大概可看到下面这样的参数列表,可能不同版本的mysql参数多少会…...
SonarQube安装及结合IDEA使用详细教程(2025适配版)
一、环境验证与准备 JDK版本确认 PS C:\> java -version openjdk version "17.0.14" 2025-01-21 LTS OpenJDK Runtime Environment Zulu17.5615-CA (build 17.0.147-LTS) OpenJDK 64-Bit Server VM Zulu17.5615-CA (build 17.0.147-LTS)安装路径说明 主程序路径&a…...
2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题E卷
目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 医院在进行网络部分信息化建设方案设计过程中,需要保证医院、血液中心通过社保网进行互连互通,同时满足献血中心与医…...
python列表基础知识
列表 创建列表 1.列表的定义:可变的,有序的数据结构,可以随时添加或者删除其中的元素 2.基本语法:字面量【元素1,元素2,元素3】使用[]创建列表 定义变量:变量名称【元素1,元素2&…...
vue echarts封装使用
echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…...
PTP协议赋能高精度时间同步网络
什么是PTP? PTP(精确时间协议,Precision Time Protocol) 是一种基于IEEE 1588标准的网络时间同步协议,旨在为分布式系统中的设备提供亚微秒级(甚至纳秒级)的高精度时钟同步。其核心目标是通过消…...
