Android---Kotlin 学习009

继承

在 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() 的子类,然后用这个子类构造出对象 pval p = object : Player(){override fun load() = "anonymous nothing...."}println(p.load())
}

伴生对象

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

import java.io.Fileopen 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.rhkb.cn/news/224596.html

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

相关文章

基于电商场景的高并发RocketMQ实战-Commitlog基于内存的高并发写入优化、基于JVM offheap的内存读写分离机制

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

HBase基础知识(五):HBase 对接 Hadoop 的 MapReduce

通过 HBase 的相关 JavaAPI,我们可以实现伴随 HBase 操作的 MapReduce 过程,比如使用 MapReduce 将数据从本地文件系统导入到 HBase 的表中,比如我们从 HBase 中读取一些原 始数据后使用 MapReduce 做数据分析。 1 官方 HBase-MapReduce 1&am…

AI数字人可以用在哪些行业,对这些行业有什么好处

引言: 在科技日新月异的今天,人工智能(AI)的发展已经深入到各个领域,尤其在旅游业、政务党建、城市园区、品牌宣传和乡村振兴等领域,AI数字人的应用正逐步改变我们的生活方式。 一.AI数字人在旅游业中的应…

Android 11.0 系统默认打开OEM解锁开关功能实现

1.前言 在11.0的系统rom定制化开发中,在9.0系统以后为了设备的安装,系统开始启用oem机制,所以在adb push文件就需要先oem解锁,然后才可以 进行相关操作,所以就需要默认打开oem解锁的开关,来方便oem解锁功能的实现 如图: 2.系统默认打开OEM解锁开关功能实现的核心类 pac…

微短剧,会成为长视频的“救命稻草”吗?

职场社畜秒变霸道总裁,普通女孩穿越成为艳丽皇妃.......这样“狗血”的微短剧,最近不仅在国内各大视频平台上异常火爆,而且还直接火出了国外。 所谓微短剧,就是单集时长从几十秒到十几分钟的剧集,有着相对明确的主题和…

redis—String字符串

目录 前言 1.字符串数据类型 2.常见命令 3.典型应用场景 前言 字符串类型是Redis最基础的数据类型,关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础.上构建的,例如列表…

JavaEE:CAS详解

一.什么是CAS CAS: 全称 Compare and swap ,字面意思 :” 比较并交换 “ ,一个 CAS 涉及到以下操作: 我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。 我们来进行操作: 1. 比较 V 和 A 是否相等。…

vue3 全局配置Axios实例

目录 前言 配置Axios实例 页面使用 总结 前言 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境。它提供了一种简单、一致的 API 来处理HTTP请求,支持请求和响应的拦截、转换、取消请求等功能。关于它的作用: 发起 HTTP …

VMware虚拟机安装Ubuntu系统教程

所使用的文件如下: VMware Workstation 17 Pro ubuntu-22.04.3-desktop-amd64.iso 一、ubuntu 命名规则及各版本一览表 1.ubuntu 命名规则: 例如:ubuntu 16.04 LTS 是长期维护版本;ubuntu 17.04 是新特性版本 前两位数字为发…

使用pytorch神经网络拟合计算模型

一. 内容简介 python调用百度翻译api,将中文论文翻译英文,并保留部分格式 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3数据文件 链接:https://pan.baidu.com/s/1csJOoErGyx77MW_FImVKjg?pwd1234 三.主要流程 3.…

【计数DP】牛客小白月赛19

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先做法一定是计数 dp 然后状态设计,先设 dp[i] 然后看影响决策的因素:两边的火焰情况,那就 dp[i][0/1][0/1]表示 前 i 个,该位有无火焰,该位右边有无火焰的方案数…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的,只有一个 single_table 表是不够的,所以为了故事的顺利发展,我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见,我们把 single_table 表称为 s1 表&#xff0…

ES8生产实践——Kibana对接Azure AD实现单点登录

基本概念介绍 什么是单点登录 单点登录(Single Sign-On,SSO)是一种身份验证和访问控制机制,允许用户使用一组凭据(通常是用户名和密码)仅需登录一次,即可访问多个应用程序或系统,而…

结构体的对齐规则

1.引入 我们在掌握了结构体的基本使⽤后。 现在我们深⼊讨论⼀个问题:计算结构体的大小。 这也是⼀个特别热门的考点: 结构体内存对齐。 2.具体分析 ⾸先我们得掌握结构体的对⻬规则: 1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量…

一站式指南:第 377 场力扣周赛的终极题解

比赛详情 比赛地址 题目一很简单题目二主要是题目长了点,其实解法很常规(比赛后才意识到)题目三套用Dijkstra算法题目四没时间解答水平还有待提升(其实就是需要灵活组合运用已知的算法,有点类似大模型的Agent) 题解和思路 第一题:最小数字…

CentOS进入单用户模式

一、重启 二、出现内核选项 按“e” 三、编辑这一行 输入 rw init/sysroot/bin/sh 四、进入单用户模式 ctrlx 进入 五、切换目录 chroot /sysroot 六、然后你就操作你的系统了。 修改密码等等

【知识点随笔分享 | 第九篇】常见的限流算法

目录 前言: 1.固定窗口限流: 缺点: 2.滑动窗口限流: 优点: 滴桶限流: 缺点: 令牌桶限流: 优点: 总结: 前言: 当今互联网时代,随着网络…

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议,其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外,还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…

数据通信网络基础华为ICT网络赛道

目录 前言: 1.网络与通信 2.网络类型与网络拓扑 3.网络工程与网络工程师 前言: 数据通信网络基础是通信领域的基本概念,涉及数据传输、路由交换、网络安全等方面的知识。华为ICT网络赛道则是华为公司提出的一种技术路径,旨在通…

主机安全技术措施

目录 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 ​编辑 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 ~over~