首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

KotlinKotlin Sealed 密封 ( 密封声明 | 密封子类定义 | 密封特点 | 代码示例 )

密封作用 : 定义一个密封 , 该类只能有有限个指定子类 , 不能在其它文件定义其它类型子类 ; 2 ....密封与枚举 : ① 相同点 ( 类型限制 ) : 从类型种类角度对比 , 与枚举类似 , 枚举集合是受限制 , 不能随意扩展 ; ② 不同点 ( 对象个数限制 ) : 从每个类型对象个数对比..., 枚举每个类型只能存在一个实例 , 而密封每个类型可以创建无数个实例 ; II ....子类声明 : 密封子类 , 必须定义在密封内部 ; ( 1.1 之后版本可以定义在同一个文件中 ) sealed class Student { class GoodStudent...密封子类 : ① 定义在密封内部 ( 推荐 ) : 密封子类建议定义在密封内部 , 可以兼容所有版本 ; ② 定义在密封所在文件 : Kotlin 1.1 以后版本 , 可以将密封子类定义在密封声明同一个文件中

87410
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin Vocabulary | 密封 sealed class

而 sealed class (本文下称 "密封" ) 则同时包含了前面两者优势 —— 抽象表示灵活性枚举里集合受限性。.../video/BV1Nk… 密封基本使用 抽象类似,密封可用于表示层级关系。...子类可以是任意: 数据Kotlin 对象、普通,甚至也可以是另一个密封。但不同于抽象是,您必须把层级声明在同一文件中,或者嵌套在内部。...Result 是一个抽象,并且包含两个构造方法: 一个私有的默认构造方法 一个合成构造方法,只有 Kotlin 编译器可以使用 这意味着其他无法直接调用密封构造方法。...,让编译器 IDE 帮忙避免类型错误吧。

1.1K10

Kotlin】常用 Kotlin ② ( 枚举 | 枚举定义函数 | 密封 )

文章目录 一、枚举 二、枚举定义函数 1、枚举定义普通函数 2、枚举定义构造函数 三、密封 一、枚举 ---- Kotlin 中使用 枚举 定义常量 , 枚举定义格式如下 : 枚举常量... 构造函数 ; 1、枚举定义普通函数 通过 枚举 类型常量 ( 实例对象 ) 可以 调用 枚举中定义方法 ; 为枚举定义普通函数 : 在枚举 Gender 中定义了 log 函数 ,...---- 枚举类型 是一组 子类型 闭集 ; 密封 可以 定义 枚举类型 子类型闭集 , 一个密封可以有多个子类 , 继承密封子类 必须 与 密封在相同 Kotlin 代码文件中 ; 密封适用于这种情况..., 要使用枚举特性 , 但是需要在枚举基础上保存多个特性 ; 枚举只能实现简单常量列举 , 如果需要更复杂 子类型闭集 , 则需要使用密封 ; 代码示例 : sealed class Gender...{ // Male Female 都是 密封 Gender 子类 object Male: Gender() object Female: Gender() } class

1K10

Kotlin中级(9)- - - Kotlin之数据密封、内部类.md

(Koltin要修改数据属性,则使用其独有的copy()函数。其作用就是:修改部分属性,但是保持其他不变) 密封 1....但是,我们知道Kotlin枚举枚举常量是受限,因为每一个枚举常量只能存在一个实例 但是其枚举不同地方在于,密封一个子类可以有可包含状态多个实例。...也可以说成,密封是包含了一组受限集合,因为里面的都是继承自这个密封。但是其其他继承(open)区别在,密封可以不被此文件外被继承,有效保护代码。...但是,其密封子类扩展是是可以在程序中任何位置,即可以不在同一文件下 2.声明 sealed class SealedExpr() 内部类(嵌套) 在实际开发中,用到内部类地方是很多。...()”访问内部类,继承子类能直接访问父公开成员属性及方法,而内部类值能通过this@外部类方式访问外部类属性方法 从能否覆盖上看,继承子类能覆盖父用open标记属性方法,内部类不能覆盖外部类属性方法

1.1K20

学习记录——抽象密封

①抽象 C#允许把函数声明为abstract,抽象不能实例化,抽象可以包含普通函数抽象函数,抽象函数就是只有函数定义,没有函数体。...如果将看做是模板,那么抽象就是一个不完整模板,我们不能使用不完整模板去构造对象。 抽象成员 通过在定义前面放置关键字 abstract,可以将声明为抽象。...②密封 密封成员 通过在定义前面放置关键字 sealed,可以将声明为密封。...例如: public sealed class D { // Class members here. } 密封不能用作基。 因此,它也不能是抽象密封禁止派生。...由于密封从不用作基,所以有些运行时优化可以略微提高密封成员调用速度。 在对基虚成员进行重写派生上,方法、索引器、属性或事件可以将该成员声明为密封成员。

35031

Java中密封介绍

事实上,引入了几个新关键字来支持密封密封密封。 这些扩充了继承经典概念,在继承概念中,只有一组特定子类才能扩展父。因此,本质上,Final不允许继承。...作为一个补充,继承是一种面向对象特性,其中继承扩展了其父特性或功能。这增强了可重用性。子类继承父质量(字段、方法嵌套),并可以通过多态性函数重载添加自己质量。...如果开发人员希望确保在不扩展情况下无法创建任何对象,我们可以使用关键字abstract声明一个。尽管抽象可以具有常规所有特性,但使用abstract关键字使其变得特别。...注意,关键字sealedpermissions都是上下文敏感,并且与或接口声明相关具有特殊含义;在Java中,它们除了此之外没有任何意义。...密封子类必须位于同一个命名模块中,尽管它们可以位于不同包中。 对于未命名模块,密封子类必须在同一个包中。 Java中密封接口 密封接口声明方式与密封几乎相同。

1.1K10

Java(接口)新类型——密封

密封 在以往Java继承中,Java继承控制非常有限,仅能通过final关键字访问控制符来控制继承。例如final无法被集成;包私有仅仅只能在该包下进行继承。 这显然是不够。...如果一个功能只允许出现在PhonePad上,不允许出现在Computer上。如果不对该功能继承实现进行限制,开发人员将很容易滥用该功能实现,错误地重用一些代码。这就是密封产生原因。...密封声明 ❝密封不仅仅可以是,也可以是接口。文章中密封为统称 密封(接口)可以明确哪些接口可以对其扩展或实现。你可以通过sealed修饰符来表明某个密封。..."); } } 密封子类类型 在上面示例中,密封(接口)实现用了final关键字标记,当然密封实现还可以是密封: /** * 密封子类 */ public sealed...❝密封中permits关键字声明子类必须是直接子类,不可间接实现。 密封不支持匿名函数式接口 由于密封必须明确继承实现关系,所以它不支持匿名

1.3K00

转向Kotlin——数据封闭

数据封闭Kotlin两种特殊,今天一起了解一下。 数据Kotlin一个语法糖。Kotlin编译器会自动为数据生成一些成员函数,以提高开发效率。...尽管前面写User实现了我们需求,但会不会也太麻烦了,每个都需要重写toStringequals等方法。为了提高开发效率,Kotlin加入了我们马上要介绍数据。...在开发中,我们经常需要复制一个对象,然后修改它一部分属性,这就需要一个复制机制,Kotlin除了为数据自动生成toString方法equals方法,还默认生成了一个copy方法,它作用就是复制数据实例...Kotlin编译器会自动为数据生成组件函数(以后会说到),隐藏,可以直接将数据成员解构: var js = Person("Js", 20) // 将js.namejs.age分别赋给nameage...中提供了一些特殊,其中数据封闭就是其中两个。

92120

Kotlin 对象介绍

介绍:在Kotlin可以包含:构造函数初始化代码块,函数,属性,内部类,对象声明....函数 介绍:通常情况下var定义都有默认getersetter.如果定义为val标签额属性那么它将没有set函数 我们也可以根据需求,进行重构属性gettersetter函数 实例1: class...:abstract) 介绍:抽象是面向对象编程特征之一.在Kotlin之中申明抽象或者函数使用关键字abstract 定义概念java 抽象抽象方法一样.不用进行具体实现....嵌套 介绍:java嵌套是一样,我们可以在class里面写嵌套....public 公共,全部地方都可访问 internal 内部,在同一个模块下可访问 Kotlin关键字其实java之中有很多相识之处.特别是权限访问修饰符.

18330

转向Kotlin——接口

声明 Java没有什么两样,Kotlin中,声明也使用class关键字,如果只是声明一个空KotlinJava没有任何区别,不过定义其他成员,区别就很大了。...Kotlin会有一些不一样地方,在Kotlin中,允许定义一个主构造器,若干个第二构造器。主构造器是一部分,紧跟在后面,参数是可选。如下代码定义了一个,并指定了一个主构造器。...KotlinJava一样,都是单继承,也就是说,一个Kotlin只能有一个父。...,用于制定规范,强调对象是否具有某个功能。...Kotlin与Java类似,使用interface声明接口,一个可以实现多个接口,实现方法继承相同,而且,接口中属性方法都是open

90030

Groovy 孵化功能-记录record密封sealed学习

类似记录不会扩展JavaRecord,Java不会将此类视为记录,但在其他方面会具有类似的属性。...密封-sealed关键字 密封、接口特性(traits)限制了哪些子类可以扩展/实现它们。在密封出现之前,层次结构设计者有两个主要选择: 设置一个关键字为final不允许扩展。...将设为public非final,以允许任何人扩展。 与这些要么全有要么全无选择相比,密封提供了一个中间地带。 密封也比以前用于实现中间地带其他技巧更灵活。...密封层次结构在已知、接口特性(traits)层次结构中提供完整继承,但在层次结构之外禁用或只提供受控继承。 例如,假设我们要创建一个仅包含圆正方形形状层次。...Groovy支持注解方式创建密封接口,也支持使用sealed关键字创建密封接口。

86020

详解 Java 17中新特性:“密封

新手段:密封 为了进一步增强限制能力,Java 17中密封增加了几个重要关键词: sealed:修饰/接口,用来描述这个/接口为密封/接口 non-sealed:修饰/接口,用来描述这个.../接口为非密封/接口 permits:用在extendsimplements之后,指定可以继承或实现 下面我们通过一个例子来理解这几个关键词用法,更多Java新特性,欢迎关注Java前沿专栏,...就可以通过引入密封特性来做限制。..., SupportHero { } 通过sealed关键词permitspermits关键来定义Hero是一个需要密封,并且它子类只允许为TankHero, AttackHero, SupportHero...:继续延续密封特性,可以继续指定继承,并传递密封定义给子类 non-sealed:声明这个为非密封,可以被任意继承 final:不允许继承 根据上面的假设需求,第一、第二层稳定,允许第三层具体英雄角色可以后期不断增加新英雄

63830

转向Kotlin——枚举扩展

枚举 Kotlin枚举Java中枚举类型非常相似,具有特性。一般将可枚举同类型一组值作为枚举定义。...因此枚举值在枚举位置枚举值对应数值可能并不相同。...无论是Java还是Kotlin都提供了相应API来获取枚举值名字索引。Kotlin提供了nameordinal属性,分别用于获取枚举值名索引。...扩展原生API 尽管JDKKotlin原生提供了很丰富API,但这些API似乎仍然不够用,就需要为这些Library添加额外API。...在外部对系统进行扩展,由于将扩展部分都放到了自己源代码中,因此这些源代码仍然可以运行在其他机器JDKKotlin运行时上。

1.3K20

Kotlin中级(7)- - - Kotlin之抽象、重载重写.md

1.抽象 抽象是不可直接被实例化,因为它有一部分属性方法没有被完整赋值体现。...而一个抽象普通区别在于抽象除了可以有其自己属性、构造函数、方法等组成部分,还包含了抽象函数以及抽象属性。...抽象规则 在Kotlin抽象在顶层定义时候只能使用public可见性修饰符修饰 抽象中可以定义内部抽象 只能继承一个抽象 若要实现抽象实例化,需要依靠子类采用向上转型方式处理...不过,抽象建议不用open修饰符修饰,因为可以复写抽象函数。 重写重载 重写重载有什么区别?...重写是写在两个,它们是继承关系 重载是在一个,相同方法名、不同参数 重载重写都是针对方法,且方法名相同

85220

Kotlin | 4.、对象接口

本章内容包括: 接口 非默认属性构造方法 数据 委托 使用 object 关键字 1、定义继承结构 /*--------------- 4.1.1 kotlin接口...* Java 方法默认是open,而 Kotlin 中默认都是final。 * 如果你想允许创建一个子类,需要使用 open 修饰符来标识这个。...*/ /*--------------- 4.1.4 内部类嵌套:默认是嵌套 -------------*/ // Kotlin 嵌套不能访问外部类实例,...// 代码清单4.1.3 作为密封表达式 // sealed class ExprS { // // 将基标记为密封.. // class...但是默认值是声明默认值 val user5 = User5() // 如果你具有一个父,主构造方法同样需要初始化父 class TwitterUser

91310

Kotlin 匿名实现接口抽象区别详解

(holder: String, itemData: Any, position: Int) { println(holder + itemData + position) } }) 抽象:...他们之间唯一区别就是调用时下面这句,抽象多了一个括号。 object : OnBind object : AbstractOnBind() 就这么一点区别,其实本质上是完全不一样。...在实现接口时,object 代替了 java 中 new 一个对象,在这里“:“ 号后紧跟接口,接口没有构造方法,代表了object实现了这个接口; 而在实现抽象时候,抽象方法后边有(),可以理解为调用了抽象方法构造方法...总结一下:为便于理解可以这么想(实际原理可能并不是这样),接口时,先有 object ,然后让 object 实现该接口;抽象时,先实现抽象抽象方法,用构造方法构造出一个对象后,再给到 object...以上这篇Kotlin 匿名实现接口抽象区别详解就是小编分享给大家全部内容了,希望能给大家一个参考。

2K30

Kotlin中级(6)- - - Kotlin继承.md

Kotlin继承 1.超(Any) 在Kotlin中,所有的都是继承自Any,这是一个没有父类型。...并且只定义了上面所示三个方法。在Java中,所有的默认都是继承于Object。而Object除了比Any多了几个方法属性外,没有太大区别。...: this(context,attrs,0) } 2.3函数重载与重写 在Kotlin中关于函数重载与重写Java中几乎是一样,但是这里还是举例说明一下 重写函数中量点特殊用法 不管是...// 注意,则`final`修饰符在编辑器中是灰色,因为Kotlin中默认默认是final 那么当一个基去继承另外一个基时,第二个基不想去覆盖掉第一个基方法时,第二个基该方法使用...") } 2.3重写属性 -重写属性重写方法大致是相同,但是属性不能被重载 重写属性即指:在基中声明属性,然后在其基实现中重写该属性,该属性必须以override关键字修饰,并且其属性具有中一样类型

58060

About Kotlin-Kotlin2About Kotlin(2)

About Kotlin(2) 继续昨天部分。介绍Kotlin。...Kotlin 抽象接口 抽象 跟Java一样,使用abstract关键字 open class Base{ open fun f(){} } abstract class Derived...密封从某种意义上说,它们是枚举扩展:枚举类型值集也受到限制,但每个枚举常量仅作为单个实例存在,而密封子类可以包含多个实例并包含状态。这样又具备了枚举不具备灵活性。...val demo = Outer().Inner().foo() 嵌套 不用inner标记,直接写在内部,在kotlin中称为所谓嵌套 class Outer{ private val...) 在Kotlin中使用对象表达式对象声明进行表示 对象表达式(匿名) 匿名其实就是在Java中匿名内部类。

2.6K20

About Kotlin-Kotlin1About Kotlin(1)

About Kotlin(1) 因为是从Java角度来学习Kotlin,在Java中,作为第一等公民。故学习Kotlin,也先从其开始。...Kotlin 普通 class Kotlin中没有添加修饰符直接以class开头都是final。final意义在于JVM可能存在优化(常量方法内联)防止继承滥用。...构造方法 Kotlin中一个有一个primary构造方法可以多个secondary构造方法。...构建这样对象需要写很多代码。 对应Open 对应上面的kotlinopen就是能够被继承了。必须在声明时候使用open关键字。...//Kotlin中所有是Any,类似于Object,不过Any不输于java.lang.Object,其有三个方法 //这里operator是操作符重载,在Kotlin符号中会说明 public

1.2K30
领券