Kotlin中特性、数据类、伴生对象、顶层函数
Kotlin中的函数参数和属性声明
在 Kotlin 中,函数参数和属性有不同的声明方式和行为。这些特性使得 Kotlin 代码更加安全、易于理解和维护。
函数参数的只读性
fun sum(a: Int, b: Int): Int {var modifiedA = aif (modifiedA > 0) {modifiedA = 1}//三元表达式val result = if (a > b) 111 else 222var s = if (a > b) {"111"} else {"222"}return modifiedA + b}
在 Kotlin 中,函数参数默认是只读的。这意味着在函数体内无法直接修改函数参数的值。如果尝试在函数内部修改函数参数,编译器会报错。
这种设计是为了提供更严格的不可变性保证。通过限制对函数参数的修改,可以确保代码的稳定性和可预测性。
与 Kotlin 不同,在 Java 中函数参数是可变的。在函数体内可以修改函数参数的值,包括基本类型和引用类型。这是因为 Java 采用的是按值传递的方式,传递的是参数值的拷贝,而不是参数本身。因此,在 Java 中,可以在方法内部修改参数的值,这种修改对方法外部是可见的。
属性的可变性
data class A(var name: String, var age: Int)open class B(name: String, age: Int)object C {fun testInstance(){}}
在 Kotlin 中,属性的可变性由 var 关键字来表示。使用 var 声明的属性是可变的(mutable),可以在对象创建后进行修改。
编译器会自动生成默认的 getter 和 setter 方法,使得可以读取和修改属性的值。例如,使用 var 声明的属性可以通过对象实例的点运算符来访问和修改,例如 a.name = "John"。
另一方面,如果不使用 var 声明属性,则属性是不可变的(immutable)。一旦在构造函数中进行初始化,就无法在对象创建后修改该属性的值。
数据类的特性
在 Kotlin 中,使用 data class 来声明数据类。数据类主要用于保存和传递数据,编译器会自动为数据类生成一些有用的功能,如 equals()、hashCode()、toString() 和 copy() 方法。
数据类提供了一种简化和标准化数据模型的方式,减少了样板代码的编写。可以直接使用对象的属性来进行比较、哈希计算、字符串表示和复制操作。
可继承类的声明
在 Kotlin 中,默认情况下类是不可继承的(final),即不能被其他类继承。但是,可以使用 open 关键字将类声明为可继承的。
使用 open class 声明的类可以作为其他类的基类,其他类可以通过继承它来扩展或修改其行为。这种设计使得类的继承关系更加明确和可控,同时保护了类的完整性和一致性。
Kotlin中的静态成员替代方式
class MyClass {companion object {const val CONSTANT_VALUE = 10fun myStaticMethod() {println("This is a static method.")}}}
在 Kotlin 中,与 Java 不同,没有直接的静态成员(静态方法、静态属性)的概念。Kotlin 推崇面向对象的思想,并提供了其他的机制来替代传统的静态成员。
可以使用以下两种方式来替代静态成员:
-
伴生对象(Companion Objects):每个类可以拥有一个伴生对象,通过
companion object关键字声明。伴生对象类似于 Java 中的静态成员,可以包含静态属性和静态方法。通过伴生对象,可以在类级别上访问这些属性和方法。 -
顶层函数和属性:在 Kotlin 中,可以在文件的顶层定义函数和属性,它们在整个文件中都没有使用限制。这些函数和属性可以在任何地方直接访问,无需通过类的实例。可以将顶层函数和属性视为文件级别的静态成员。
// 顶层函数的定义
fun greet(name: String) {println("Hello, $name!")
}// 顶层属性的定义
val PI = 3.14159
这些替代方式提供了灵活性和可扩展性,同时避免了传统静态成员带来的使用伴生对象和顶层函数/属性来实现静态成员的优点。这种设计使得代码更加模块化、可测试和可扩展,符合现代软件开发的最佳实践。
总结
Kotlin 在函数参数和属性声明上提供了更严格的控制和更灵活的特性。函数参数默认是只读的,属性可以根据需求声明为可变或不可变。数据类简化了数据模型的定义和操作,而可继承类的声明使得类的继承关系更加清晰和可控。
此外,Kotlin 使用伴生对象和顶层函数/属性来替代传统的静态成员概念。这种设计使得代码更具模块化和可测试性,并避免了静态成员带来的限制和问题。
通过深入理解 Kotlin 的这些特性,开发人员可以编写更安全、更灵活和更易于维护的代码,提高开发效率和代码质量。
相关文章:
Kotlin中特性、数据类、伴生对象、顶层函数
Kotlin中的函数参数和属性声明 在 Kotlin 中,函数参数和属性有不同的声明方式和行为。这些特性使得 Kotlin 代码更加安全、易于理解和维护。 函数参数的只读性 fun sum(a: Int, b: Int): Int {var modifiedA aif (modifiedA > 0) {modifiedA 1}//三元表达式v…...
《PostgreSQL物化视图:创建、维护与应用》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...
shell脚本之test命令
shell脚本之test命令 数值比较:2. 字符串比较:3. 文件测试:4. 逻辑操作:5. 其他测试: test命令在Shell脚本中用于进行条件测试和条件判断。它用于检查文件、字符串和数值的各种条件,并返回一个状态码&#…...
JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 目录 一、什么是装饰模式二、…...
Linux学习之MySQL备份
xtrabackup资源下载 完全备份与恢复 # 1.物理备份与恢复 # 冷备份,需停止数据库服务 适合线下服务器。 [rootmysql50 ~]# systemctl stop mysqld [rootmysql50 ~]# mkdir /bakdir [rootmysql50 ~]# cp -r /var/lib/mysql /bakdir/mysql.bak [rootmysql50 ~]# cd /…...
时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化
时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化 目录 时序分解 | MATLAB实现北方苍鹰优化算法NGO优化VMD信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 北方苍鹰优化算法NGO优化VMD,对其分解层数,惩罚因子数做优化…...
分类预测 | Matlab实现RBF-Adaboost多特征分类预测
分类预测 | Matlab实现RBF-Adaboost多特征分类预测 目录 分类预测 | Matlab实现RBF-Adaboost多特征分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于RBF-Adaboost数据分类预测(Matlab完整程序和数据) 2.多特征输入…...
【Java代码规范】阿里编码规约 VS CheckStyle
全文速览: 1、关于代码编码质量2、如何小成本有效管理企业内的编码规范 2.1 阿里编码规约IDE插件2.2 CheckStyle IDE插件 3、如何在代码提交中检验规范 3.1 阿里编码规约配置git precommit check3.2 CheckStyle配置git precommit check3.3 实践 1、关于代码编码质…...
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标?
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标? 1、在iPhone苹果手机上找到「设置」并点击打开; 2、在苹果iPhone设置内找到「辅助功能」并点击打开; 3、在苹果iPhone手机辅助功能内的动作交互内找到「触控」并点击打开;…...
kibana报错内存溢出问题解决
一、背景: kibana内存溢出,进程被kill掉,导致前端页面访问不到。 报错内容 二、报错原因: 发现是前端 js 报的内存 oom 异常,通过网上资料发现node.js 的默认内存大小为1.4G Node 中通过 JavaScript 使用内存时只能…...
【C语法】1124循环结构
#include <stdio.h> int main(){ //输入一个数。倒叙输出各个位上的数。 //123456 6 5 4 3 2 1 // 1输出个位上的数 %10 // 2将这个数去掉个位上的数。 / 10 // 3当这个数最后变成0时结束 int a 0; printf("请输入一个正整数:"); scanf…...
在PHP8中向数组添加元素-PHP8知识详解
在php8中向数组添加元素有多种方法,在这里主要讲解几个常用的方法:使用方括号[]添加元素、使用array_unshift()函数,向数组的头部添加元素、使用array_push()函数,向数组的尾部添加元素、使用array_splice()函数添加元素。 1、使用…...
Drupal __ 8.5.0 __ XSS文件上传 __CVE-2019-6341
Drupal __ 8.5.0 __ XSS文件上传 __CVE-2019-6341 说明内容漏洞编号CVE-2019-6341漏洞名称Drupal XSS漏洞漏洞评级中危影响范围在7.65之前的Drupal 7版本中; 8.6.13之前的Drupal 8.6版本; 8.5.14之前的Drupal 8.5版本。漏洞描述Drupal诞生于2000年,是一…...
Pycharm中配置Celery启动
Pycharm中配置Celery启动 前置条件 目录结构 ----FerDemo --------celery_demo ------------tasks.py tasks.py文件代码 import sys import time from celery import Celeryapp Celery(demo,backendredis://:password127.0.0.1/0,brokerredis://:password127.0.0.1/1,broker…...
Jmeter —— 常用的几种断言方法(基本用法)
在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言,断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过,本文 主要介绍几种常用的断言&…...
mybatis bean属性识别丢失【NoSuchPropertyException】
背景 发现线上报错日志 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression Cause: org.apache.ibatis.ognl.NoSuchPropertyException: 参考 https://github.com/mybatis/mybatis-…...
点云从入门到精通技术详解100篇-基于补全点云与图像像素级融合的障碍物识别
目录 前言 感知融合技术研究现状及问题 感知融合技术概述 特征级融合研究现状...
商品分类显示scroll-view布局实现
快捷键 view{菜单数据$}*40 回车后即可快速生成 <view class="cates"> <!-- 搜索开始 --><SearchBar></SearchBar> <!-- 搜索结束 --> <view class="cates_container"> <!-- 左侧菜单 开始 --> <scroll-vie…...
基本的SELECT语句——“MySQL数据库”
各位CSDN的uu们好呀,好久没有更新小雅兰的MySQL数据库专栏啦,接下来一段时间,小雅兰都会更新MySQL数据库的知识,下面,让我们进入今天的主题吧——基本的SELECT语句!!! SQL概述 SQL语…...
DedeCMS5.7远程文件包含漏洞分析
看一段php代码 <?php foreach(Array(_GET,_POST,_COOKIE) as $_request){foreach($$_request as $_k > $_v) ${$_k} $_v; }echo a:.$a;echo b:.$b;这段代码可以实现创建变量并赋值的操作,而且参数都是可控的。 如果之前已经有了相应参数,那就会…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
