Kotlin基础语法五

  • 继承与重载的open关键字
    KT所有的类,默认是final修饰的,不能被继承,和Java相反
    open:移除final修饰

  • 类型转换

open class Person2(private val name: String) {fun showName() = "父类 的姓名是【$name】"// KT所有的函数,默认是final修饰的,不能被重写,和Java相反open fun myPrintln() = println(showName())
}class Student2(private val subName: String) : Person2(subName) {fun showName2() = "子类 的姓名是【${subName}】"override fun myPrintln() = println(showName2())}// TODO 84.Kotlin语言的类型转换学习
// 1.普通运行子类输出
// 2.is Person Student File
// 3.is + as 转换
fun main() {val p: Person2 = Student2("王五")p.myPrintln()println(p is Person2)println(p is Student2)println(p is File)// is + as = 一般是配合一起使用if (p is Student2) {(p as Student2).myPrintln()}if (p is Person2) {// (p as Person2).myPrintln() // 因为子类重写了父类println((p as Person2).showName())}
}
  • 智能类型转换
open class Person3(val name: String) {private fun showName() = "父类显示:$name"open fun myPrintln() = println(showName())fun methodPerson() = println("我是父类的方法...") // 父类独有的函数
}class Student3(val nameSub: String) : Person3 (nameSub) {override fun myPrintln() = println("子类显示:$nameSub")fun methodStudent() = println("我是子类的方法...") // 子类独有的函数
}fun main() {val p : Person3 = Student3("李四")(p as Student3).methodStudent()p.methodStudent()// 智能类型转换:会根据上面 as 转成的类型,自动明白,你现在的类型就是上面的类型
}
  • Any超类
    所有的类都默认继承Any超类,等于Java的Object

  • 对象声明 object

  • 对象表达式

interface RunnableKT {fun run()
}open class KtBase88 {open fun add(info: String) = println("KtBase88 add:$info")open fun del(info: String) = println("KtBase88 del:$info")
}// 1.add del println
// 2.匿名对象表达式方式
// 3.具名实现方式
// 4.对Java的接口 用对象表达式方式
fun main() {// 匿名对象 表达式方式val p : KtBase88 = object : KtBase88() {override fun add(info: String) {// super.add(info)println("我是匿名对象 add:$info")}override fun del(info: String) {// super.del(info)println("我是匿名对象 del:$info")}}p.add("李元霸")p.del("李连杰")// 具名实现方式val p2 = KtBase88Impl()p2.add("刘一")p2.del("刘二")// 对Java的接口 用   KT[对象表达式方式]  方式一val p3 = object : Runnable {override fun run() {println("Runnable run ...")}}p3.run()// 对Java的接口 用   Java最简洁的方式 方式二val p4 = Runnable {println("Runnable run2 ...")}p4.run()// 对KT的接口 用   KT[对象表达式方式]  方式一object : RunnableKT {override fun run() {println("RunnableKT 方式一 run ...")}}.run()// 对KT的接口 用   Java最简洁的方式 方式二/*RunnableKT {}*/
}// 小结:Java接口,有两种方式 1(object : 对象表达式)  2简洁版,
//       KT接口,只有一种方式 1(object : 对象表达式)// 具名实现  具体名字 == KtBase88Impl
class KtBase88Impl : KtBase88() {override fun add(info: String) {// super.add(info)println("我是具名对象 add:$info")}override fun del(info: String) {// super.del(info)println("我是具名对象 del:$info")}
}
  • 伴生对象
// 伴生对象的由来: 在KT中是没有Java的这种static静态,伴生很大程度上和Java的这种static静态 差不多的
// 无论 KtBase89() 构建对象多少次,我们的伴生对象,只有一次加载
// 无论 KtBase89.showInfo() 调用多少次,我们的伴生对象,只有一次加载
// 伴生对象只会初始化一次companion object {val info = "UserInfo"fun showInfo() = println("显示:$info")val name = "Derry"}
  • 内部类 & 嵌套类
// TODO 内部类
// 内部类的特点: 内部的类 能访问 外部的类
//              外部的类 能访问 内部的类
class Body(_bodyInfo: String) { // 身体类val bodyInfo = _bodyInfofun show() {Heart().run()}// 默认情况下:内部的类 不能访问 外部的类,要增加修饰符inner 成为内部类才可以访问外部类inner class Heart { // 心脏类fun run() = println("心脏访问身体信息:$bodyInfo")}inner class Kidney { // 肾脏fun work() = println("肾脏访问身体信息:$bodyInfo")}inner class Hand { // 手inner class LeftHand { // 左手fun run() = println("左手访问身体信息:$bodyInfo")}inner class RightHand { // 右手fun run() = println("右手访问身体信息:$bodyInfo")}}
}// 默认情况下:就是嵌套类关系
// 嵌套类特点:外部的类 能访问 内部的嵌套类
//           内部的类 不能访问 外部类的成员
class Outer {val info: String  = "OK"fun show() {Nested().output()}class Nested {fun output() = println("嵌套类")}
}fun main() {// 内部类:Body("isOK").Heart().run()Body("isOK").Hand().LeftHand().run()Body("isOK").Hand().RightHand().run()// 嵌套类:Outer.Nested().output()}
  • 数据类
// set get 构造函数 解构操作 copy toString hashCode equals  数据类 生成 更丰富
data class ResponseResultBean2(var msg: String, var code: Int, var data: String) : Any()
  • copy
//  深拷贝 重新创建对象
data class User(val name: String)
val a = User("Alice")
val b = a.copy()
println(a === b) // 输出 false//浅拷贝 复用同一个对象
data class Book(val title: String)
data class User(val name: String, val book: Book)val u1 = User("Bob", Book("Kotlin"))
val u2 = u1.copy(name = "Alice")
u2.book.title = "Java" // 会同时修改u1.book
  • 解构声明
// 普通类
class Student1(var name: String , var age: Int, var sex: Char) {// 注意事项:component0 顺序必须是 component1 component2 component3 和成员一一对应,顺序下来的operator fun component1() = nameoperator fun component2() = ageoperator fun component3() = sex
}// 数据类
data class Student2Data(var name: String , var age: Int, var sex: Char)fun main() {val(name, age, sex) = Student1("李四", 89, '男')println("普通类 结构后:name:$name, age:$age, sex:$sex")val(name1, age1, sex1) = Student2Data("李四", 89, '男')println("数据类 结构后:name:$name1, age:$age1, sex:$sex1")val(_, age2, _) = Student1("李四", 89, '男')println("数据类 结构后: age2:$age2")
}
  • 运算符重载
// 写一个数据类,就是为了,toString 打印方便而已哦
data class AddClass2(var number1: Int, var number2: Int) {operator fun plus(p1: AddClass2) : Int {return (number1 + p1.number1) + (number2 + p1.number2)}
}// TODO 94-Kotlin语言的运算符重载学习
fun main() {// C++语言  +运算符重载就行了  -运算符重载就行了// KT语言  plus代表+运算符重载println(AddClass2(1, 1) + AddClass2(2, 2))
}
  • 密封类
    ‌1. 替代枚举(Enum),但支持更灵活的数据类型‌
    ‌枚举的局限性‌:每个枚举值只能是单例,不能携带不同的数据。
    ‌密封类的优势‌:每个子类可以有自己的属性和方法,且可以是object(单例)或data class(带数据)。
sealed class PaymentMethod {data class CreditCard(val cardNumber: String, val expiryDate: String) : PaymentMethod()data class PayPal(val email: String) : PaymentMethod()object Cash : PaymentMethod()
}

‌2. 结合 when 表达式,实现编译期安全检查‌

sealed class ApiResult {data class Success(val data: String) : ApiResult()data class Error(val message: String, val code: Int) : ApiResult()
}fun handleResult(result: ApiResult) = when (result) {is ApiResult.Success -> println("成功: ${result.data}")is ApiResult.Error -> println("错误: ${result.message} (${result.code})")// 不需要 else,编译器确保所有情况已覆盖
}
  1. 适用于状态管理(如 UI 状态、业务逻辑状态)‌
sealed class UiState {object Loading : UiState()data class Success(val data: List<String>) : UiState()data class Error(val message: String) : UiState()
}fun updateUI(state: UiState) = when (state) {is UiState.Loading -> showProgressBar()is UiState.Success -> showData(state.data)is UiState.Error -> showError(state.message)
}

‌4. 替代 when + else 的防御性编程‌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库:关系型数据库的基石

文章目录 每日一句正能量前言一、MySQL简介&#xff08;一&#xff09;什么是MySQL&#xff1f;&#xff08;二&#xff09;MySQL的历史 二、MySQL的特点&#xff08;一&#xff09;开源与免费&#xff08;二&#xff09;高性能&#xff08;三&#xff09;跨平台支持&#xff0…

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收扫描任务信息通过调用masscan启动探测任务,获取进度和结果信息,…

ARM 和 x86_64是什么关系

什么是 ARM 和 x86_64&#xff1f; 它们都是 CPU 指令集架构&#xff08;ISA&#xff09; 指令集架构&#xff08;Instruction Set Architecture&#xff09;就是&#xff1a; CPU 能够理解和执行的“语言”和“命令格式”。 类比解释&#xff1a;指令集就像“语言” 类比对…

nginx配置中有无‘‘/’’的区别

在Nginx配置中&#xff0c;location指令末尾的斜杠/和proxy_pass目标地址末尾的斜杠/组合使用会产生显著差异。以下是四种组合的区别详解&#xff1a; ​​核心区别对比表​​ 配置方案匹配规则请求URI传递逻辑实际转发效果示例location /api/ proxy_pass ...701/仅匹配/api/…

系统安全之身份认证

本篇我们对常用的身份认证协议做简要的梳理&#xff0c;包括主流的 HTTP 相关认证协议以及证书密钥对、新兴的 WebAuthn 认证。 HTTP 协议认证 RFC 7235 中定义了 HTTP 协议的认证框架&#xff0c;要求在支持 HTTP 协议的服务器&#xff0c;如果访问服务的身份验证失败&#…

部署http服务

使用flask搭建一个http服务&#xff0c;能够通过本地的另外一个终端访问对应接口&#xff0c;拿到服务端的计算结果 服务端&#xff1a; 创建一个test_http_dtw.py并运行 from flask import Flask, request, jsonifyapp Flask(__name__)# 示例分析函数 def analysis(data):…

WLAN 技术指南:从入门到原理

文章目录 目录 文章目录 前言 一.WLAN 基本概念 有线侧组网概念 AP-AC 组网方式 AC 连接方式 CAPWAP 协议 无线侧组网概念 无线信道 ​编辑 BSS/SSID/BSSID ​编辑 VAP ESS 二.WLAN 组网架构 基本的 WLAN 组网架构 四.WLAN 工作原理 AP 上线 AP 获取 IP 地址阶段 CAP…

语言学习专用AI播放器推荐:LLPlayer

学语言&#xff0c;经常会看大量的比较优秀的视频材料&#xff0c;那么推荐一款语言学习利器&#xff0c;极大提高生产力。 LLPlayer 是一款专为语言学习者设计的独特视频播放器。 它具有许多重要功能&#xff0c;例如可同时显示文本字幕和位图字幕、使用 OpenAI Whisper 自动…

mysql 关联表查询,索引失效

来源表: ##示例 CREATE TABLE order_wide (order_id varchar(33) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 订单ID,member_id int(11) DEFAULT NULL COMMENT 用户ID,content varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 订单标签,PRIMARY KEY (order_…

Oracle DG库手动注册归档日志的两种方法

Oracle DG库手动注册归档日志的两种方法 注册单个归档日志文件注册多个归档日志文件有的时候由于网络或各种原因,Oracle DG库服务器上可能缺少部分归档日志文件,导致DG库的MRP进程一直处于WAIT_FOR_GAP状态。 此时我们可以手动从主库或其他DG拷贝归档日志到当前DG服务器,并…

中小型VUE3项目创建流程相关命令tips

开新项目因为距离上次初始化时间太过久远,忘记初始化命令的有多少? 不得已简要记录一下流程 1. 使用vite构建新项目 1.1 构建 npm create vite@latest my-vue-app --template vue1.2 安装依赖 npm install1.3 启动 npm run dev参考文档 2. 添加需要的插件 2.1 准备工作…

Web后端开发(请求、响应)

目录 请求&#xff1a; Postman&#xff1a; 简单参数&#xff1a; 实体参数&#xff1a; 数组集合参数&#xff1a; 日期参数&#xff1a; Json参数&#xff1a; 路径参数&#xff1a; 响应&#xff1a; 请求响应&#xff1a; 请求&#xff1a;获取请求数据 响应&a…

Excel大厂自动化报表实战(互联网金融-数据分析周报制作上)

这是Excel大厂自动化报表实战第二期--互联网金融-数据分析周报制作上 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;2.4自动化报表-8月成交数据.xlsx&#xff0c;2.4自动化报表-8月获客数据.csv等2个文件 链接: https://pan.baidu.co…

HTTP 网络协议演进过程

网络协议演进问题&#xff0c;涉及到HTTP版本之间的连接复用优化和协议升级&#xff08;特别是从HTTP/2到HTTP/3&#xff09;的核心变化。我们以 HTTP/1.0 到 HTTP/2.0&#xff0c;再到 HTTP/3.0 的演进顺序来详细解释它们在通道复用&#xff08;TCP/QUIC&#xff09;上的优化和…

Xsens动捕和Manus数据手套在元宇宙数字人制作中提供解决方案

硬件连接与数据传输 Xsens与Manus集成&#xff1a;Xsens惯性动作捕捉系统负责捕捉人体的身体动作&#xff0c;Manus数据手套专门精确捕捉手指动作。Xsens动捕套装上有接口或无线连接模块&#xff0c;可与Manus手套配对和传输数据&#xff0c;将身体与手指跟踪数据结合。 Face…

【Java开发日记】简单说一说使用 Netty 进行 Socket 编程

目录 什么是 Netty 对比Netty和传统的Socket 传统Socket编程服务端 传统Socket编程客户端 Netty环境搭建 先创建出来一个项目 Netty服务端程序 Netty客户端程序 Channel Channel分类 为什么选择Netty 什么是 Netty Netty是由JBOSS提供的一个java开源框架&#xff0c…

目标检测任务的评估指标mAP50和mAP50-95

mAP50 和 mAP50-95 是目标检测任务中常用的评估指标&#xff0c;用于衡量模型在不同 交并比&#xff08;IoU&#xff09;阈值 下的平均精度&#xff08;Average Precision, AP&#xff09;。它们的区别主要体现在 IoU 阈值范围 上。 ✅ 1. mAP50&#xff08;mean Average Prec…

COHERENT XPRV23光电接收器控制软件

COHERENT XPRV23光电接收器控制软件

执行应用共享内存空间 同步QT进行快速捕获数据流

引言&#xff1a;本文章针对驱动的应用app&#xff0c;例如sensor data内容的获取&#xff0c;显示到QT的一种办法&#xff0c;共享内存。举例子&#xff0c;这是一个常见需求&#xff0c;比如摄像头采集进程与 GUI 显示进程分离&#xff0c;通过共享内存传输图像&#xff0c;避…

opencl的简单介绍以及c++实例

&#x1f9e9; 一、什么是 OpenCL&#xff1f; OpenCL&#xff08;Open Computing Language&#xff09; 是一个用于异构计算的开放标准&#xff0c;由 Khronos Group 提出和维护。它允许你在各种计算设备上&#xff08;如 CPU、GPU、DSP、FPGA&#xff09;并行运行代码&#…