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.mzph.cn/news/577772.shtml

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

相关文章

Redis设计与实现之服务器与客户端

目录 一、服务器与客户端 1、初始化服务器 1. 初始化服务器全局状态 2. 载入配置文件 3. 创建 daemon 进程 4. 初始化服务器功能模块 5. 载入数据 6. 开始事件循环 2、 客户端连接到服务器 3、命令的请求、处理和结果返回 4、命令请求实例:SET 的执行过程 5、Redis服…

数据仓库【1】:简介

数据仓库【1】:简介 1、诞生背景1.1、数据仓库诞生原因1.2、历史数据积存1.3、企业数据分析需要 2、基本概述2.1、数据仓库(Data Warehouse,DW)2.2、数据仓库特点2.3、数据仓库 VS 数据库 3、技术实现3.1、数据仓库建设方案3.2、传…

sql_lab之sqli中的搜索型注入

搜索型注入 原理是运用模糊查询: select * from users where username like %a% 1.找到具有模糊查询的搜索框的注入点 2.构造闭合 因为模糊查询的代码是 select * from users where username like %a% 所以应该 鱼%’ -- s 判断构造闭合的函数是否正确 鱼%…

【JavaEE初阶一】线程的概念与简单创建

1. 认识线程(Thread) 1.1 关于线程 1.1.1 线程是什么 由前一节的内容可知,进程在进行频繁的创建和销毁的时候,开销比较大(主要体现在资源的申请和释放上),线程就是为了解决上述产生的问题而提…

apache禁止遍历目录

禁止Apache显示目录索引,禁止Apache显示目录结构列表,禁止Apache浏览目录,这是网上提问比较多的,其实都是一个意思。下面说下禁止禁止Apache显示目录索引的常见的3种方法。 要实现禁止Apache显示目录索引,只需将 Optio…

Jenkins的特殊操作定时自动执行任务以及测试报告调优

java -Dhudson.model.DirectoryBrowserSupport.CSP -jar Jenkins.war 测试报告 不美丽 执行上面的代码 重启jenkins 就好了

Ai企业系统源码 Ai企联系统源码 商用去授权 支持文心 星火 GPT4等等20多种接口

智思Ai系统2.4.9版本去授权(可商用)支持市面上所有版本的接口例如:文心、星火、GPT4等等20多种接口!代过审AI小程序类目!!! 安装步骤: 1、在宝塔新建个站点,php版本使用…

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

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

铁山靠之——HarmonyOS组件 - 2.0

HarmonyOS学习第二章 一、HarmonyOS基础组件的使用1.1 组件介绍1.2 Text1.2.1 文本样式1.2.2 设置文本对齐方式1.2.3 设置文本超长显示1.2.4 设置文本装饰线 1.3 Image1.3.1 设置缩放类型1.3.2 加载网络图片 1.4 TextInput1.4.1 设置输入提示文本1.4.2 设置输入类型1.4.3 设置光…

王道考研计算机网络——数据链路层

码元和信号变化是一一对应的 低通:低于最高频率的可以通过 奈氏准则无噪声,香农定理有噪声 给出db,利用公式求出S/N 放到数字信道上传输就是基带信号,放到模拟信道上传输就是宽带信号 把基带信号调制成宽带信号之后,…

JSON在Java中的使用

目录 第一章、快速了解JSON1.1)JSON是什么1.2)json的语法格式①键值对、字符串、数字、布尔值、数组、对象②嵌套的格式 1.3)为什么使用JSON 第二章、发送和接收JSON格式数据2.1)postman发送JSON格式数据2.2)Java后端接…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 ,感觉大佬在矩阵转置那块介绍的还是有些简略,我自己又做了点动图加以补充理解。膜拜大佬! Part A 先解决解析命令行参数的…

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

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

MyBatis——MyBatis的缓存

MyBatis的缓存 创建工程: 1缓存介绍 为什么使用缓存? 首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少IO、硬盘读写次数、提高效率 Mybatis中的一级缓存和二级缓存?…

【SD】通过种子数 差异强度 进行 角色融合【2】

通过 对 2个种子 进行对比 生成 2张图片 风格相符合的图片 best quality,masterpiece,chibi,full body, 我们首先生成1张图 Seed: 726932558 我们再次生成一张图 Seed: 3824894478 随机种子:图一 随机种子:图二 差异强度:0.2 差异强度0.4 差…

31. Ajax

简介 AJAX 是 Asynchronous JavaScript And XML 的简称。直译为,异步的JS和XML。AJAX的实际意义是,不发生页面跳转、异步载入内容并改写页面内容的技术。AJAX也可以简单的理解为通过JS向服务器发送请求。 AJAX这门技术很早就被发明,但是直到…

前端框架前置学习(4) AJAX

同步代码和异步代码 同步代码 浏览器按照我们书写代码的顺序一行一行地执行程序.浏览器会等待代码的解析和工作,在上一行代码完成之后才会执行下一行代码.这被称之为同步程序 逐行执行,需要原地等待结果 异步代码 异步编码技术使得程序可以在执行一个可能长期运行的任务的…

助力打造清洁环境,基于轻量级YOLOv8开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题,公共环境下垃圾投放点都会有固定的值班时间,但是考虑到实际扔垃圾的无规律性,往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题,有些容易扩散的垃圾比…

将elementUI,NaiveUI的progress环形进度条设置为渐变色

需求 :进度条要有一个渐变效果。效果图: NaiveUI和elementUI的官方progress组件都是只能设置一种颜色,不符合需求所以改一下。 其实NaiveUI和elementUI设置进度条的实现方式基本一样都是使用svg渲染出两个path,第一个是底色&…

<meta name=“Keywords“ content=““ >、<meta name=“Description“ content=““ > 等用法解释

今天在看网站代码&#xff0c;发现类似<meta name"Keywords" content"" >、<meta name"Description" content"" >这样的写法&#xff0c;不知道具体代表什么意思&#xff0c;于是上网搜了一下&#xff0c;下面是在网上找到…