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() 的子类,然后用这个子类构造出对象 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 关键字修饰。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

09-为Java开疆拓土的ZGC深度剖析

文章目录 引言ZGC出现背景STW带来的问题手机系统(Android) 显示卡顿证券交易系统实时性要求大数据平台(Hadoop集群性能) 垃圾回收器的发展 ZGC介绍ZGC中JVM内存布局和设计为什么这么设计? ZGC支持NUMA(了解即可) ZGC的核心概念指针着色技术&a…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…

Redis源码精读:字符串

文章目录 前言代码位置核心类型SDS结构获取sds字符串的元数据的宏获取字符串长度重新设置sds长度创建字符串感悟最后 前言 Redis中实现了sds(simple dynamic string)这种字符串,它比c语言标准库的char*字符串更加实用 代码位置 src/sdc.h …

Ascon加解密算法分析

参数定义 加密架构图 整个过程是在处理320bits的数据,所以在最开始需要对原始的数据进行一个初始化,获得320bits的数据块, 图里看到的pa和pb都是在做置换(对320bits的数据进行一个置换) 置换(Permutation&…

不可能得到的最短骰子序列

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 给你一个长度为 n 的整数数组 rolls 和一个整数 k 。你扔一个 k 面的骰子 n 次,…

Vue 封装echarts饼状图(Pie)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 效果显示&#xff1a; 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title"><div>{{ title }}</div>…

【隐私保护】使用Python从文本中删除个人信息:第一部分

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Flowable-升级为7.0.0.M2-第一节

目录 升级jdk升级springboot到3.1.3升级数据库连接池druid-spring-boot-3-starter到1.2.20升级mybatis-plus到3.5.3.2升级flowable到7.0.0.M2 最近有些读者一直问flowable如何升级到7.0.0.M2&#xff0c;接下来我就一步步的把flowable升级到7.0.0.M2 升级jdk flowable7.x采用的…

《PySpark大数据分析实战》-19.NumPy介绍ndarray介绍

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

微信小程序合集更更更之echarts雷达图!

实现效果 写在最后&#x1f352; 更多相关内容&#xff0c;关注&#x1f365;苏苏的bug&#xff0c;&#x1f361;苏苏的github&#xff0c;&#x1f36a;苏苏的码云~

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…

OpenAI换血大震动始末:“ChatGPT之父”奥特曼,缘何被“扫地出门”?

近期&#xff0c;AI业界发生了一场“大地震”。作为聊天机器人ChatGPT的开发者&#xff0c;OpenAI无疑是最受关注的人工智能公司之一。就是这家公司的联合创始人、CEO、有“ChatGPT之父”之称的阿尔特曼在“疯狂的5天”里&#xff0c;经历了被闪电免职、加入微软、最终又官复原…

微服务架构<2>

在电商项目中&#xff0c;我们针对一些核心业务&#xff0c;比较复杂的业务需要做一些设计以及优化的过程首先我们针对于订单的模块拆分了2个子模块1.order-curr实时下单业务 2.order-his 做一些历史的订单归档我们的订单业务 >商品添加至购物车 >购物车结算--> 订单…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(二)权限认证

上篇博文中我们已经实现了登录拦截&#xff0c;接下来我们继续补充代码&#xff0c;实现权限的认证 一、RBAC权限模型 什么事RBAC权限模型&#xff1f; RBAC权限模型&#xff08;Role-Based Access Control&#xff09;即&#xff1a;基于角色的权限访问控制。在RBAC中&#x…

MySQL——进阶篇

二、进阶篇&#x1f6a9; 1. 存储引擎&#x1f346; 1.1 MSQL体系结构 连接层&#xff1a; 连接处理&#xff0c;连接认证&#xff0c;每个客户端的权限 服务层&#xff1a; 绝大部分核心功能&#xff0c;可跨存储引擎 可插拔存储引擎&#xff1a; 需要的时候可以添加或拔掉…

代码随想录算法训练营第二十七天|组合总和等

77 组合 1 描述 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 2 代码 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:path []rst…

新型智慧城市解决方案:PPT全文56页,附下载

关键词&#xff1a;智慧城市解决方案&#xff0c;智慧城市管理技术&#xff0c;智慧城市建设&#xff0c;数字城市建设 一、智慧城市宏观形势 1、政策支持&#xff1a;出台了一系列政策&#xff0c;鼓励和支持智慧城市的发展。这些政策为智慧城市的建设提供了政策保障和资金支…

网络安全法规和模型

基础 ISO信息安全&#xff1a;为数据处理系统建立和采取技术、管理的安全保护&#xff0c;保护计算机硬件、软件、数据不因偶然的或恶意的原因而受到破坏、更改、泄露 信息安全属性&#xff1a; CIA三元组&#xff1a;保密性、完整性、可用性 其他属性&#xff1a;真实性、不…

2023-12-25 事业-代号s-shein分析

前阵子SHEIN看的比较多,几乎把市面上的报告和趋势都研究了下,总结了这篇关于SHEIN的一切,从0开始全面的了解下SHEIN,比较通俗易懂,可以看看。 如果你还不了解SHEIN这家公司,想知道知道,可以翻看下,快速get这家公司的点如果你想了解下这家公司怎么发展和快速提升的,可以…

16路彩灯控制器 FPGA-Verilog

#16路彩灯控制器 FPGA-Verilog# 1、Verilog代码编写 1.1输入输出信号确定 题目要求多路彩灯控制器通过对应的开关按钮&#xff0c;能够控制多个彩灯的输出状态&#xff0c;组合多种变幻的灯光效果。 彩灯控制器的功能描述为&#xff1a; 设计一个多路彩灯控制器&#xff0…