Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类
参考链接
Kotlin官方文档
https://kotlinlang.org/docs/home.html
中文网站
https://www.kotlincn.net/docs/reference/properties.html
本系列为参考Kotlin中文文档
https://download.csdn.net/download/u011109881/21418027
整理的笔记
pdf也可以在这里下载
https://www.kotlincn.net/docs/kotlin-docs.pdf
因为密封类与枚举类关系比较紧密 临时调整学习顺序 先学习枚举类 再学习密封类
第二章 第十一节 枚举类
知识点
1 枚举类的基本用法
2 构造函数带参数的枚举
3 枚举类型可以定义成员变量与方法
4 枚举类实现抽象方法
5 在枚举类中实现接口
6 枚举的switch case
笔记
fun main() {// 1 枚举类的基本用法println(Direction.EAST)// 每种枚举类型都是一个枚举的类的类型println(Direction.EAST is Direction)// 2 构造函数带参数的枚举println(Color.BLUE)println(Color.BLUE.rgb)// 3 枚举类型可以定义成员变量与方法Color2.BLUE.test()Color2.BLUE.property = "property"println(Color2.BLUE.property)// 4 枚举类实现抽象方法println(ProtocolState.TALKING.signal())println(ProtocolState.WAITING)// 5 在枚举类中实现接口println(EnumImplInterface.PLUS)// 6 枚举的switch caseval driver1 = Driver(LicenseStatus.UNQUALIFIED);println(driver1.checkLicense())val driver2 = Driver(LicenseStatus.LEARNING);println(driver2.checkLicense())
}// 6 枚举的switch case
enum class LicenseStatus {UNQUALIFIED,LEARNING,QUALIFIED;
}class Driver(var status: LicenseStatus) {fun checkLicense(): String {return when (status) {LicenseStatus.LEARNING -> "在学"LicenseStatus.QUALIFIED -> "有资格"LicenseStatus.UNQUALIFIED -> "没有资格"}}
}// 5 在枚举类中实现接口
interface IAdd {fun add(a: Int, b: Int): Intfun sub(a: Int, b: Int): Int
}enum class EnumImplInterface() : IAdd {PLUS,SUB;override fun add(a: Int, b: Int): Int {return a + b}override fun sub(a: Int, b: Int): Int {return a - b}
}// 4 枚举类实现抽象方法
enum class ProtocolState {WAITING {override fun signal() = "WAITING"},TALKING {override fun signal() = "TALKING"};abstract fun signal(): String
}// 3 枚举类型可以定义成员变量与方法
enum class Color2() {RED,GREEN,BLUE;fun test() {println("test")}var property: String = ""
}// 2 构造函数带参数的枚举 带有一个属性 rgb
enum class Color(val rgb: Int) {RED(0xFF0000),GREEN(0x00FF00),BLUE(0x0000FF)
}// 1 枚举类的基本用法
enum class Direction {// Kotlin 种的枚举也是一个类NORTH, SOUTH, WEST, EAST
}class D0311EnumClass
第二章 第八节密封类
知识点
1 密封类
2 继承自密封类
3 密封类中switch case的使用
4 密封类 实战2
5 总结 密封类vs枚举类
笔记
fun main() {// 1 密封类// 密封类用来表示受限的类继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。// 在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。// 简而言之 枚举类里面的各种case是单例 但是密封类的各种case不一定是单例// 2 继承自密封类// val a = Expr() //密封类本身是抽象的 不能实例化val b = Const(12.0)val c = Sum(b, b)val d = NotANumberval e = NotANumberprintln(d === e)// 3 密封类中switch case的使用// 使用密封类的关键好处在于使用 when 表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。// 当然,这只有当你用 when 作为表达式(使用结果)而不是作为语句时才有用。println(eval(Const(16.1)))println(eval(Sum(Const(16.1), Const(13.9))))println(eval(NotANumber))// 4 密封类 实战2 该案例参考自bilibili动脑学院P102密封类val status: LicenseStatus2 = LicenseStatus2.Learningval driver = Driver2(status)println(driver.checkLicense())val driver2 = Driver2(LicenseStatus2.Qualified("12345"))println(driver2.checkLicense())// 5 总结 密封类vs枚举类// 枚举类每个类型都是单例 密封类每个类型可以是单例也可以不是 相比于枚举类 密封类更加灵活
}// 4 密封类 实战2
sealed class LicenseStatus2 {object UnQualified : LicenseStatus2()// 密封类子类 单例 无状态object Learning : LicenseStatus2()// 密封类子类 单例 无状态// 可以有多个实例 licenseId是一个状态 不同driver的licenseId可以不一样class Qualified(val licenseId: String) : LicenseStatus2()
}class Driver2(var status: LicenseStatus2) {fun checkLicense(): String {return when (status) {is LicenseStatus2.Learning -> "在学"is LicenseStatus2.UnQualified -> "没有资格"is LicenseStatus2.Qualified -> "有驾驶证. 驾驶证编号:${(this.status as LicenseStatus2.Qualified).licenseId}"}}
}// 3 密封类种switch case的使用
fun eval(expr: Expr): Double = when (expr) {is Const -> expr.numberis Sum -> eval(expr.e1) + eval(expr.e2)NotANumber -> Double.NaN// else -> 0.0 // 'when' is exhaustive so 'else' is redundant here// 不再需要 `else` 子句,因为我们已经覆盖了所有的情况
}// 密封类不允许有非-private 构造函数(其构造函数默认为 private)
sealed class Expr1(parameter: String) {// Constructor must be private or protected in sealed class// public constructor(parameter: String, parameter2: String) : this(parameter)
}// 2 继承自密封类
// 密封类
// 虽然密封类也可以有子类,但是所有子类都必须在与密封类自身相同的文件中声明
// 注意,扩展密封类子类的类(间接继承者)可以放在任何位置,而无需在同一个文件中。
sealed class Expr// 数据类继承密封类
data class Const(val number: Double) : Expr()// 数据类继承密封类
data class Sum(val e1: Expr, val e2: Expr) : Expr()// 单例继承密封类
object NotANumber : Expr()class D0308SealedClass
Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类相关推荐
- Kotlin学习笔记 第二章 类与对象 第五节 可见性 第六节 扩展
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第七节 数据类
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第一节类与继承(补)
参考链接 Kotlin官方文档 Kotlin docs | Kotlin 本系列为参考Kotlin中文文档 kotlin官方文档2020版.pdf-其它文档类资源-CSDN下载 第二章 第一节 类与继 ...
- Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第三节接口 第四节 函数式接口
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第二节属性
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第九节 泛型
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第十节 内部类嵌套类
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
最新文章
- MongoDB 启动 Failed to connect to 127.0.0.1:27017, reason: 由于目标计算机积极拒绝,无法连接。...
- 记一次ssh登录异常
- python正则表达式中的转义字符_详解python中正则表达式的反斜线的转义功能
- leetcode 1787. 使所有区间的异或结果为零
- mulitp request
- MySql-Proxy之多路结果集归并
- Netty源码解读(一)概述
- 骑行GPS导航套件:多普达D600+夏新GPS-166+灵图天行者9配合,伴我骑行千里
- Oracle数据泵的使用
- Xshell设置密钥登录CentOS6.5_64位(图文版)
- SketchUp Pro 2018 Mac OS X/Windows 64/32位产品下载
- CTC Loss和Focal CTC Loss
- kafka auto.offset.reset latest earliest 详解
- Android 使用第三方SDK 一般流程
- 2022讯飞——糖尿病遗传风险检测挑战赛解决方案
- Peewee fn 用法
- 群晖3617可以有几个网卡_Nvme pcie千兆有线网卡
- 教育之星 计算机,冉冉升起的教育之星
- 数据库连接池 ( 二 ) 连接池概念
- 卷积神经网络( CNN)与全卷积神经网络(FCN)
热门文章
- echarts 柱状图圆柱_Echarts 柱状图配置详解
- win32常用文件操作
- datasnap——动态注册服务类
- [转]Aptana Studio 3配置Python开发环境图文教程
- HFUT 1357.梯田AGAIN(安徽省2016“京胜杯”程序设计大赛 D)
- NoSQL数据库--简介
- 深度学习——用softmax函数来规范可变参数
- 考前一个月,不,只剩29天
- java 泛型 class t_java 泛型中classT 和T的区别是什么?
- python flask和django_真正搞明白Python中Django和Flask框架的区别