文章目录

  • I . 密封类概念
  • II . 密封类声明
  • III. 密封类注意事项
  • IV . 密封类 示例代码

I . 密封类概念


1 . 密封类作用 : 定义一个密封类 , 该类只能有有限个指定的子类 , 不能在其它文件定义其它类型子类 ;

2 . 密封类与枚举类 :

① 相同点 ( 类型限制 ) : 从类型种类角度对比 , 类与枚举类类似 , 枚举类的值的集合是受限制的 , 不能随意扩展 ;

② 不同点 ( 对象个数限制 ) : 从每个类型对象个数对比 , 枚举类的每个类型只能存在一个实例 , 而密封类的每个类型可以创建无数个实例 ;

II . 密封类声明


1 . 密封类声明 : 在 class 前添加 sealed 修饰符 , 即可将该类声明为密封类 ;

sealed class Student{}

2 . 子类声明 : 密封类的子类 , 必须定义在密封类的内部 ; ( 1.1 之后的版本可以定义在同一个文件中 )

sealed class Student {class GoodStudent : Student()
}

为了版本兼容 , 还是定义在密封类内部吧 ;

III. 密封类注意事项


1 . 抽象类本质 : 密封类本质是抽象类 , 其类型不能被实例化 , 只能实例化其子类 ;

2 . 私有构造函数 : 密封类的构造函数默认是 private 私有的 , 其构造函数必须是私有的 , 不允许非私有构造函数存在 ;

3 . 密封类子类 :

① 定义在密封类内部 ( 推荐 ) : 密封类的子类建议定义在密封类内部 , 可以兼容所有版本 ;

② 定义在密封类所在文件 : Kotlin 1.1 以后的版本 , 可以将密封类子类定义在密封类声明的同一个文件中 ;

4 . 密封类孙子类 : 密封类子类也可以被继承 , 其孙子类没有继承限制 , 可以在其它类中继承定义 ;

5 . when 语句 : 在 when 语句中判定 , 必须有 else 其它情况进行兜底 , 但是判定密封类子类时 , 如果 when 中列举了所有的密封类子类 , 此时可以不写 else 分支 , 详情看下面的示例代码 ;

IV . 密封类 示例代码


package sealedsealed class Student {/*** 注意 : 只有被 open 修饰的函数才能被 override 重写*/open fun study(){println("学习")}/*** 子类 1*/class GoodStudent : Student(){override fun study() {println("学习很好")}fun read(){println("读书")}}/*** 子类 2*/class NormalStudent : Student(){override fun study() {println("学习一般")}fun seat(){println("静坐")}}/*** 子类 3*/class BadStudent : Student(){override fun study() {println("学的很渣")}fun play(){println("打游戏")}}}fun main() {// 1 . 测试密封类子类 1var goodStudent : Student.GoodStudent = Student.GoodStudent()//学习很好goodStudent.study()//读书studentAction(goodStudent)//2 . 测试密封类子类 2var normalStudent : Student.NormalStudent = Student.NormalStudent()//学习一般normalStudent.study()//静坐studentAction(normalStudent)//3 . 测试密封类子类 3var badStudent : Student.BadStudent = Student.BadStudent()//学的很渣badStudent.study()//打游戏studentAction(badStudent)}/*** 根据不同的类型执行不同的方法*/
fun studentAction(student : Student) = when(student){//如果已经覆盖了 3 个子类 , 即所有的情况 , 此时可以不需要定义 else 语句is Student.GoodStudent -> student.read()is Student.BadStudent -> student.play()is Student.NormalStudent -> student.seat()//else -> println("其它情况")
}

执行结果 :

学习很好
读书
学习一般
静坐
学的很渣
打游戏

【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )相关推荐

  1. java原子变量的作用_AtomicInteger原子类的作用介绍(代码示例)

    本篇文章给大家带来的内容是关于AtomicInteger原子类的作用介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. AtomicInteger 原子类的作用 多线程操 ...

  2. KMM Kotlin expect的几种声明方式

    前言 Kotlin的expect关键字一般用在多平台上,比如在多平台项目中的common中声明方法签名,然后由不同的平台去实现该方法,从而实现一个多平台(跨平台)方法. 创建KMM项目可以参考: KM ...

  3. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )

    文章目录 一.创建支持 Kotlin 的 NDK 项目 二.Kotlin 语言中使用 NDK 要点 1.加载动态库 2.声明 ndk 方法 3.Project 下的 build.gradle 配置 4 ...

  4. java 成员变量声明顺序_C++核心准则讨论:按照成员声明的顺序定义和初始化成员变量...

    Discussion: Define and initialize member variables in the order of member declaration 讨论:按照成员声明的顺序定义 ...

  5. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  6. c++父类和子类转化致命的代码错误

    最近在工作中,出现了严重的代码错误,对象的基类和子类的继承,代码大致如下: class A { };class B : public A { }void main() {A* a;(用于子类对象来进行 ...

  7. python函数定义及调用-python函数声明和调用定义及原理详解

    这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...

  8. 声明变量和定义变量的区别是什么?

    1.什么是定义,什么是声明 (1)在 C语言中,使用变量之前必须先定义变量.所谓定义变量,就是编译器创建了一个变量,为这个变量分配一块内存并命名(变量名).例如,定义整型变量 a. int a; 这条 ...

  9. 简单明了的区分C++ C语言中声明(declaration)、定义(definition)、签名(signature)的区别

    无论是在C或者C++中,我们常常把声明和定义给弄混淆了,分不清楚,天真的认为这个两个东西是没有任何的区别,但是其实不以为然.下面我们来简单的阐述这两者的区别. 何为声明(declaration)? 声 ...

最新文章

  1. 支付宝 php rsa算法,:PHP支付宝接口RSA验证
  2. JAVA基础8-封装(2)
  3. b站python教程哪个好_推荐B站上的Python学习资源
  4. java 乐观锁 实例_JAVA乐观锁实现-CAS(示例代码)
  5. shp2sde命令行方式向arcsde批量导入数据脚本的生成步骤
  6. python贪心算法求删数问题_贪心算法删数问题
  7. hadoop hive hbase 入门学习 (二)
  8. 程序员不是神,心态决定一切
  9. OSChina 周二乱弹 ——流川枫与苍井空
  10. 为什么要进行前后端分离
  11. 华为防火墙NAT配置及简介
  12. adb命令读取Android手机内存卡文件
  13. css文本行高是哪个属性_CSS样式----CSS属性:字体属性和文本属性(图文详解)...
  14. PS进阶篇——如何PS软件给房间地板换颜色(五)
  15. Android中当item数量超过一定大小时,将RecyclerView高度固定
  16. Ubuntu16.04系统安装谷歌浏览器(Google chorm)与有道云词典
  17. Picasso 源码 学习(一) 图片加载流程
  18. SCHNOKA施努卡:3D视觉装配引导解决方案
  19. win11内存完整性不兼容驱动程序的五种删除方法
  20. 诺辉健康开启发售:预计2020年亏损约8亿元,陈一友为实控人

热门文章

  1. 洛谷2051 [AHOI2009]中国象棋
  2. ECharts 之 环形图
  3. lucene 自定义评分
  4. AseoZdpAseo.init(this, AseoZdpAseo.INSERT_TYPE);
  5. android studio 模拟器中文乱码
  6. 第2章 基本的TCP套接字
  7. Delphi 2010 refactor / refactoring 重构不能使用的原因以及解决
  8. Python进程学习笔记-进程创建fork
  9. C语言实现常用数据结构——队列
  10. uva11990 动态逆序对