Android---Kotlin 学习009

news2025/2/11 21:11:18

继承

在 java 里如果一个类没有被 final 关键字修饰,那么它都是可以被继承的。而在 kotlin 中,类默认都是封闭的,要让某个类开放继承,必须使用 open 关键字修饰它,否则会编译报错。此外在子类中,如果要复写父类的某个方法,需要用到关键字 Override(在 kt 中就不是注解了)。并且被复写的方法也需要用 open 关键字来修饰。

open class Product(var name : String){
    fun description() = "Product: $name"

    open fun load() = "Nothing..."
}

class LuxuryProduct : Product("Luxury"){
    override fun load(): String = "LuxuryProduct loading...."
}

fun main() {
    val luxuryProduct : Product = LuxuryProduct()
    println(luxuryProduct.load())
}

类型转换

kotlin 的 is 运算符是个不错的工具,可以用来检查某个对象的类型。

    val p : Product = LuxuryProduct()
    println(p.load())
    // is 类型检测
    println(p is Product)
    println(p is LuxuryProduct)
    println(p is File)

类型转换,用到关键字 as  

智能类型转换

kotlin 编译器很聪明,只要成功完成一次类型转换,编译器允许你不再经过类型转换而直接使用。

Any 超类

我们知道在 java 里面有一个超类 Object,它是所有类的父类。而在 kotlin 里,每一个类都会继承一个共同的叫做 Any 的超类,无需在代码里显示指定。

对象

Object 关键字

1. 使用 object 关键字,你可以定义一个只能产生一个实例的类-单例

2. 使用 object 关键字有三种方式

\bullet 对象声明

\bullet 对象表达式

\bullet 半生对象

对象声明

对象声明有利于组织代码和管理状态,尤其是管理整个应用运行生命周期内的某些一致性状态。

打印它多次。结果都是同一个对象实例,所以是单例对象。

    println(ApplicationConfig)
    println(ApplicationConfig)

对象表达式

有时候你不一定非要定义一个新的命名类不可,也许你需要某个现有类的一种变体实例,但只需用一次就行了。事实上,对于这种用完就丢的类实例,连命名都可以省了。这个对象表达式是 XX 的子类,这个匿名类依然遵循 object 关键字的一个规则,即一旦实例化,该匿名类只能有唯一一个实例存在。

open class Player{
    open fun load() = "load nothing..."
}

fun main() {
    // 通过 object 声明对象。这种方式生成的是 Player() 的子类,然后用这个子类构造出对象 p
    val p = object : Player(){
        override fun load() = "anonymous nothing...."
    }

    println(p.load())
}

伴生对象

如果你想将某个对象的初始化和一个类实例捆绑在一起,可以考虑使用伴生对象,使用 companion 修饰符,你可以在一个类定义里声明一个伴生对象,一个类里只能有一个伴生对象

import java.io.File

open class ConfigMap{

    companion object{
        private const val PATH = "https://..."

        fun load() = File(PATH).readBytes()
    }
}

fun main() {
    ConfigMap.load()
}

只有初始化 ConfigMap 类或者调用了 load() 函数的时候,它里面的伴生对象(companino object)的内容才会载入。而且无论 ConfigMap 实例化了多少次,它里面的伴生对象都只有一份存在。

嵌套类

如果一个类只对另一个类有用,那么将其嵌入到该类中并使这两个类保持在一起是合乎逻辑的,可以使用嵌套类。

实例:装备和玩家。当我们需要装备时,肯定是需要玩家的。

class Player2{

    class Equipment(var name : String){
        fun show() = println("equipment $name")
    }

    fun battle(){
        Equipment("sharp knife").show()
    }
}

fun main() {
    //TODO Player2 直接使用它内部的 Equipment 类,并调用 show() 方法
    Player2.Equipment("AK47").show()
}

*数据类*

\bullet 数据类,是专门设计用来存储数据的类,用关键字 data 修饰;

\bullet 数据类提供了 toString 的个性化实现;

通过 println() 打印该类

println(Coordinate(10, 20))

示例1:Coordiante() 类没有使用 data 关键字修饰

示例2:用 data 修饰,那么该类就提供了 toString() 的个性化实现 

通过 show Kotlin Bytecode 查看 toString() 的默认实现。

\bullet == 符号默认情况下,比较对象就是比较它们的引用值,数据类提供了 equals 和 hashCode 的个性化实现。

我们通过  show Kotlin Bytecode 查看到,它还重写了 equals 和 hashCode 两个方法

copy

数据类还提供了一个比较好用的 copy 函数,它可以用来方便地复制一个对象。假设你想创建一个 Student 实例,除了 name 属性,它拥有和另一个现有 Student 实例完全一样的属性值,如果 Student 是个数据类,那么复制现有 Student 实例就很简单了,只要调用 copy 函数,给想修改的属性传入值参就可以了。

示例:

注意:因为用 copy 去构造一个对象时,创建了一个新的对象,它没有用到 次构造函数。所以 rose 的 score 就是 0。如下代码所示:

解构声明

这也是数据类一个非常好的特性。解构语法就是:一个集合里面有3个元素,我们直接要把这三个元素拿出来给3个变量赋值(注意:List 本身就支持解构语法)。如下所示:

val (x, y, z) = listOf(1, 2, 3)

示例1:普通类支持 解构语法,通过 operator fun component() 组合函数

示例2:数据类 直接支持 解构语法。

 数据类背后自动帮我们生成了 operator。通过 show Kotlin Bytecode 查看

运算符重载

数据 经常就有 + 或者 - 这种数据操作,而当我们要对 数据类 进行数据那些类似的+或者-操作时,直接的 + 或者 - 肯定是不行的,如下代码所示:

所以,当我们没发对数据类进行普通的 + 或者 -  操作时,这时就需要运算符重载操作了。如果要进行 + 操作,那么就要重写这个 plus 函数

 

使用数据类的条件

正是因为上述这些特性,才倾向于用数据类来表示存储数据的简单对象,对于那些经常需要比较、复制或打印自身内容的类,数据类尤其适合它们。然而,一个类要成为数据类,也要符合一定条件。总结下来,主要有三个方面:

\bullet 数据类必须有至少带一个参数的主构造函数;

\bullet 数据类主构造函数的参数必须是 val 或 var;

\bullet 数据类不能使用 abstract、open、sealed 和 inner 修饰符。

枚举类

枚举类,用来定义常量集合的一种特殊类。enmu 关键字修饰。在 java 里,enmu 关键字后面不会跟 class 关键字,而在 kotlin 里需要,表示它是一个枚举类。

注意:如果通过 Direction.EASE 来调用 EASE,那么这个 EASE 就是 Direction 的一个实例。

枚举类也可以定义函数。这就是与 java 里的枚举的差异。

枚举类可以提供构造函数,内部也可以声明函数。

代数数据类型

可以用来表示一组子类型的闭集,枚举类就是一种简单的代数数据类型(ADT)

enum class DriveLience {
    UNQUALIFIED,
    LEARNING,
    QUALIFIED;
}

class Driver(val status : DriveLience){
    fun checkLicense() : String{
        return when (status){
            DriveLience.UNQUALIFIED -> "没有驾驶证"
            DriveLience.LEARNING -> "正在考证"
            DriveLience.QUALIFIED -> "有驾驶证"
            // 不需要 else 分支
        }
    }
}

fun main() {
    println(Driver(DriveLience.LEARNING).checkLicense())
}

密封类

当有更复杂的需求,枚举类就显得不够了,例如当 Driver 有驾驶证时,我们需要打印出它的驾驶证 id,这种情况就需要用到密封类

对于更复杂的 ADT,你可以使用 Kotlin 的密封类(sealed class)来实现更复杂的定义,密封类可以用来定义一个类似于枚举类的 ADT,但你可以更灵活地控制某个子类型

密封类可以有若干个子类,要继承密封类,这些子类必须和它定义在同一个文件里。密封类用 sealed 关键字修饰。

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

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

相关文章

Vim 到底原来可以配置得如此漂亮!

高考志愿、考研保研、职业规划、简历优化,欢迎加入《猴哥成长营》! https://www.yuque.com/jackpop/ulig5a/srnochggbsa2eltw?singleDoc 上大学时,特别喜欢折腾,不厌其烦。 对于Linux、vim这些,可以一遍又一遍的进行…

关于Sneaky DogeRAT特洛伊木马病毒网络攻击的动态情报

一、基本内容 作为复杂恶意软件活动的一部分,一种名为DogeRAT的新开源远程访问特洛伊木马(RAT)主要针对位于印度的安卓用户发动了网络安全攻击。该恶意软件通过分享Opera Mini、OpenAI ChatGOT以及YouTube、Netfilx和Instagram的高级版本等合…

Java中synchronized锁升级过程是什么样的

参考文章一 参考文章二 参考文章三 在Java中,对象锁的状态是为了减少同步操作的开销而设计的,主要包括无锁、偏向锁、轻量级锁和重量级锁几个级别。锁的状态会随着竞争情况的不同而升级,但是不会降级。以下是锁状态的一般升级过程&#xff1…

ISP 状态机轮转和bubble恢复机制学习笔记

1 ISP的中断类型 ISP中断类型 SOF: 一帧图像数据开始传输 EOF: 一帧图像数据传输完成 REG_UPDATE: ISP寄存器更新完成(每个reg group都有独立的这个中断) EPOCH: ISP某一行结尾(默认20)就会产生此中断 BUFFER DONE: 一帧图像数据ISP完全写到DDR了 2 ISP驱动状态机 通过camer…

Java第二十一章课堂总结

计算机应用实现了多台计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据。编写网络应用程序前,首先必须明确所要使用的网络协议…

(10)Linux冯诺依曼结构操作系统的再次理解

💭 前言:本章我们首先会明确冯诺依曼体系结构的概念,旨在帮助大家理解体系结构在硬件角度去理解数据流走向的问题。理解完之后我们再去谈操作系统、更多有关操作系统的细节,着重谈谈操作系统概念与定位、操作系统是如何去做管理的…

ref组合式api声明状态

一、ref声明响应式状态(支持所有类型),因为内部维护一个refImpl对象{value:***},,如下图: ref声明的数字、字符、布尔、对象、数组类型的值都存在refImpl 对象的value属性里面 所以,如果要改变ref 声明的变…

阿里云经济型e实例2核2G3M99元1年,性价比超高的入门级云服务器

产品简介 经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理器内存配比,采用非绑定CPU…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC(Inter-Integrated Circuit),也称为IC或TWI(Two-Wire Interface),是一种广泛使用的串行…

《图解HTTP》第1章 了解Web及网络基础

《图解HTTP》第1章 了解Web及网络基础 1. 使用 HTTP 协议访问 Web1.1 网络基础 TCP/IP1.2 TCP/IP 协议族1.2.1 TCP/IP 的分层管理 1. 使用 HTTP 协议访问 Web Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议) 的协议作为…

弱电工程中发包、承包、分包、转包、内包、挂靠一次搞清楚

前言 工程建设中的发包、承包、分包、转包、内包、挂靠是实务中一个非常普遍的工程现象和常见的法律问题。对这几个问题的正确理解和把握是正确处理工程实务的基础。但由于每个工程项目的实际情况不同、实务操作中的形式各异,这几者的关系不好把握,容易…

AI 绘画StableDiffusionWebui图生图

介绍 stable-diffusion-webui AI绘画工具,本文介绍图生图,以一张图片做底图优化生成。 例如:上传一张真人照片,让AI把他改绘成动漫人物;上传画作线稿,让AI自动上色;上传一张黑白照&#xff0c…

k8s初学

1.k8s是什么? kubernetes:8个字母省略,就是k8s 自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统。 k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。 2.docker微服务,可以…

CSRF(Pikachu)

CSRF(get) 首先我们先登录账号 admin 密码是;123456 点击修改个人信息 用F12或者BP 抓包看看我们的url 那么构成的CSRF攻击payload为http://pikachu.shifa23.com/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sexboy&phonenum”手机…

【大厂面试】之 美团(一面经含答案)

美团 一面 tcp三次握手,四次挥手。time-wait、close-wait状态。MSL代表什么?为什么time-wait是2MSL,可不可以更长?如果不设置time-wait有什么影响 time-wait是主动关闭方的一个状态;close-wait是被动关闭方的一个状态…

中庸 原文与译文

《中庸》是中国古代论述人生修养境界的一部道德哲学专著,是儒家经典著作之一,原属《礼记》第三十一篇,相传为战国时期子思所作。 其内容肯定“中庸”是道德行为的最高标准,认为“至诚”则达到人生的最高境界,并提出“…

代码随想录第四十一天(一刷C语言)|打家劫舍打家劫舍II打家劫舍III

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、打家劫舍 思路:参考carl文档 1、确定dp数组以及下标的含义:下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 2、确定递…

财务数据智能化:用AI工具高效制作财务分析PPT报告

Step1: 文章内容提取 WPS AI 直接打开文件,在AI对话框里输入下面指令: 假设你是财务总监,公司考虑与茅台进行业务合作、投资或收购,请整合下面茅台2021年和2022年的财务报告信息。整理有关茅台财务状况和潜在投资回报的信息&…

连锁餐饮数字化:一体化运营管控平台

内容来自演讲:刘腾飞 | 上海奥谱创网络科技有限公司 | CEO 摘要 本文介绍了企业级管理系统的需求和现状,以及如何通过数据指标为依据的改善循环来优化企业的运营。文章还提出了场景驱动、迭代上线的方法,并介绍了两个平台、三个统一的解决方…

等级保护安全的管理机构与管理制度

目录 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定和发布 评审和修订 安全管理机构的控制点 岗位设置 人员配备 授权和审批 沟通和合作 审核和检查 安全管理制度的控制点 安全管理制度 指定…