Kotlin快速入门系列7

Kotlin的数据类密封类枚举类

数据类

与Java等语言不同,kotlin创建只包含数据的类时,需要在类名前声明关键字:data。

data class KotlinBean (val brand : String)

在kotlin中,编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:

· equals()
· hashCode()

· toString()

· componentN() functions (对应于属性,按声明顺序排列)

· copy()

如果这些函数已经在类中被明确定义了,或者从超类中继承而来,就不再会生成。不是所有的kotlin类都能声明为数据类,一般数据类声明都要满足以下条件:

· 主构造函数至少包含一个或多个参数;

· 所有的主构造函数的参数必须标识为val或var;

· 数据类不可声明为abstract,open,sealed或者inner;

· 数据类不能继承其他类(但是可以实现接口)。

Copy()

望词生意,此方法作用就是复制,我们可以使用该函数复制对象并修改部分属性,比如对于上面的KotlinBean类,实现类似下面示例:

fun copy(brand: String = this.brand) = KotlinBean(brand)

需要修改数据类的属性时用copy(),示例:

data class KotlinBean (val brand : String)fun main(args: Array<String>) {val jack = KotlinBean(brand = "Jack")val olderJack = jack.copy(brand = "olderJack")println(jack)println(olderJack)
}

对应控制台命令输出为:

数据类及其解构声明

解构声明,kotlin允许展示单个复合值,并使用它来初始化多个单独的变量。例如:

val pt=Point(111,222)
val (x,y)=pt
println(x) //打印111
println(y) //打印222

元组(标准数据类)

Kotlin的标准库提供了Pair(元组)和Triple(三元元组),可以把多个值同时赋给一个变量,或者同时给多个变量赋值。在新版的Kotlin中已经删除了多元元组,也就是只有Pair和Triple。

通常我们在对变量进行赋值时,只能附带一个值,例如:

val name = "batman"

通过元组对变量进行多个赋值,构造时也都可以通过泛型指定各个位置的对象类型:

fun main(args: Array<String>) {val batMan = Triple<String,String,Int>("Bluce","technology",10000)val jokerMan = Pair<String,String>("joker","Gotham")println(batMan.first)println(batMan.second)println(batMan.third)println("----------------------")println(jokerMan.first)println(jokerMan.second)
}

对应的控制台输出为:

 

可以发现Kotlin的元组在进行单独类多数据交互情景下比Java友好(Java还要先声明一个bean类然后进行set/get操作)。值得一提的是,上述示例也用到了元组的常用API,比如Pair的:

pair.first    //获取第一个元素
pair.second   //获取第二个元素

Tuples的方法:

tuples.first  //获取第一个元素
tuples.second //获取第二个元素
third.third //获取第三个元素

两个类还都有toList()方法可以把存储的对象转化为List,这里不做赘述。

密封类

密封类用于表示受限制的类层次结构,当一个值只能在一个集合中取值时,而不能取其他值时。在某种意义上,这是枚举类的扩展(枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例)。

声明密封类,需要用关键字sealed来修饰。被sealed修饰的类默认是open的,所以可以被继承,而不需要显式使用open修饰符。虽然密封类可以有子类,但是所有的子类必须要内嵌在密封类中。

sealed不能修饰interface,abstract class(会报warning,但是不会出现编译错误)

sealed class SealedClass{class ExtendClass1: SealedClass(){}class ExtendClass2: SealedClass(){}
}fun check(sealedClass: SealedClass): String =when(sealedClass){is SealedClass.ExtendClass1 -> "1"is SealedClass.ExtendClass2 -> "2"}

在密封类中使用 when 表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。

枚举类

枚举类就是一组命名的常数,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

枚举类的最基本的用法是实现类型安全的枚举,其中枚举常量用逗号分隔,每个枚举常量都是一个对象。

enum class Color{RED,YELLOW,BLUE,GREEN
}

枚举初始化

每一个枚举都是枚举类的实例,它们都可以被初始化:

enum class Color(val rgb: Int) {RED(0xFF0000),YELLOW(0xFFFF00),GREEN(0x00FF00),BLUE(0x0000FF)
}

通常用法也较简单:

fun main(args: Array<String>) {println(Color.YELLOW.name)println(Color.YELLOW.ordinal)
}

对应的控制台输出为:

细心的你肯定会发现上述的两个参数.name和.ordinal。在枚举类中,每个枚举常量都具有在枚举类声明中获取其名称与位置的属性:

val name: String   //名称
val ordinal: Int   //枚举值所在枚举数组中定义的顺序

换言之,每个枚举类中的常量都可以 .name 拿到名称,.ordinal 拿到位置(从0开始算起)。

如果要指定位置,则可以使用其构造函数:

enum class Shape(value:Int){ovel(100),rectangle(200)
}

枚举类还支持以声明自己的匿名类及相应的方法、以及覆盖基类的方法。例如:

enum class Fruit {EATING {override fun signal() = DRINKING},DRINKING {override fun signal() = EATING};abstract fun signal(): Fruit
}

这里要注意的是,如果枚举类定义任何成员,要使用分号将成员定义中的枚举常量定义分隔开。

使用枚举常量

Kotlin 中的枚举类具有合成方法,允许遍历定义的枚举常量,并通过其名称获取枚举常数。(假设枚举类的名称是 EnumClass)格式如下:

EnumClass.valueOf(value: String): EnumClass  // 转换指定 name 为枚举值,若未匹配成功,会抛出IllegalArgumentException
EnumClass.values(): Array<EnumClass>        // 以数组的形式,返回枚举值

对应的简单示例如下:

enum class Color {RED,YELLOW,BLUE,GREEN
}fun main(args: Array<String>) {var color:Color=Color.BLUEprintln(Color.values())println(Color.valueOf("RED"))println(color.name)println(color.ordinal)
}

相应的控制台输出为:

 

枚举常量还实现了 Comparable 接口,其中的自然顺序是它们在枚举类中定义的顺序,对此接口有兴趣的可以自己去尝试实现验证。

End,如有问题请留言交流。

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

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

相关文章

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限&#xff0c;一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具&#xff0c;默认开启873端口 https://vulhub.org/#/envir…

【数据分析】numpy基础第一天

文章目录 前言本文代码&#xff1a;使用jupyter notebook打开本文的代码操作示例步骤1.打开Anaconda Powershell Prompt步骤2.复制代码文件地址步骤3.在Anaconda Powershell Prompt中打开jupyter notebook步骤3.5.解决一个可能的问题步骤4.在浏览器中查看ipynb文件步骤5.运行代…

【STC8A8K64D4开发板】第2-10讲:定时器/计数器

第2-10讲&#xff1a;定时器/计数器 学习目的了解定时器/计数器的概念和区别。掌握STC8A8K64D4定时器/计数器的应用流程及程序设计。 Timer原理 定时器几乎是每个单片机必有的重要外设之一&#xff0c;可用于定时、精确延时、计数等等&#xff0c;在检测、控制领域有广泛应用。…

JAVA多线程并发补充

AQS 是一个抽象父类 全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架。 用 state 属性来表示资源的状态&#xff08;分独占模式和共享模式&#xff09;&#xff0c;子类需要定义如何维护这个状态&#xff0c;控制如何获取锁和释放锁 getSt…

C#学习笔记-反射

前言 反射是.NET中的重要机制&#xff0c;通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息&#xff0c;还可以动态创建出类型实例并执行其中的方法。 反射的功能很强大&#xff0c;任何复杂抽象的分层架构或者复杂的设计模式均是建立在这些…

前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)

目录 前言一、效果展示二、实现步骤1. 实现线条宽度&#xff08;strokeWidth&#xff09;的属性模块2. 实线线条样式&#xff08;strokeDashArray&#xff09;的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们初步实现了右侧属性栏…

掌握使用 React 和 Ant Design 的个人博客艺术之美

文章目录 前言在React的海洋中起航安装 Create React App安装Ant Design 打造个性化的博客风格通过路由实现多页面美化与样式定制部署与分享总结 前言 在当今数字时代&#xff0c;个人博客成为表达观点、分享经验和展示技能的独特平台。在这个互联网浪潮中&#xff0c;选择使用…

电商API接口接入|电商爬虫实践附代码案例

1.爬虫是什么 首先应该弄明白一件事&#xff0c;就是什么是爬虫&#xff0c;为什么要爬虫&#xff0c;百度了一下&#xff0c;是这样解释的&#xff1a;网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追…

二叉搜索树操作题目:二叉搜索树中的插入操作

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树中的插入操作 出处&#xff1a;701. 二叉搜索树中的插入操作 难度 3 级 题目描述 要求 给定二叉搜索…

当身体发出这八个信号时注意了!这有可能就是植物神经紊乱!

植物神经系统是人体自主神经系统的一部分&#xff0c;它调节内脏器官的活动并维持人体内环境的平衡。植物神经紊乱是指植物神经系统失去平衡而引起的一系列身体反应。这些反应可能是不规律、异常或者不适当的。 那么&#xff0c;植物神经紊乱有哪些常见的信号呢&#xff1f;下…

老龄化对投资意味着什么?

1月15日&#xff0c;国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措&#xff0c;为我国首个以“银发经济”命名的政策文件。 近期&#xff0c;国信证券分析师王开发布题为《银发经济再思考&#xff1a;老龄化对投资的影响》的报告&#xff0…

Java面试题(11)

59.说一说springMVC的运行流程 1. 用户向服务器发送请求&#xff0c;请求被 Spring 前端控制 Servelt DispatcherServlet 捕获&#xff1b; 2. DispatcherServlet 对请求 URL 进行解析&#xff0c;得到请求资源标识符&#xff08;URI&#xff09;。然后根据该 URI&#xff0c;…