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

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

密封概念 II . 密封声明 III. 密封注意事项 IV . 密封 示例代码 I . 密封概念 ---- 1 ....密封作用 : 定义一个密封 , 该类只能有有限个指定的子类 , 不能在其它文件定义其它类型子类 ; 2 ....密封声明 ---- 1 . 密封声明 : 在 class 前添加 sealed 修饰符 , 即可将该类声明为密封 ; sealed class Student{} 2 ....密封注意事项 ---- 1 . 抽象本质 : 密封本质是抽象 , 其类型不能被实例化 , 只能实例化其子类 ; 2 ....密封子类 : ① 定义在密封内部 ( 推荐 ) : 密封的子类建议定义在密封内部 , 可以兼容所有版本 ; ② 定义在密封所在文件 : Kotlin 1.1 以后的版本 , 可以将密封子类定义在密封声明的同一个文件中

1.3K10

Java密封的介绍

今天将给大家介绍一下Java中的密封。 SealedJava武器库中的一个新引入(JDK17)。由于这一添加,在Java编程语言中的关键字集合中添加了另一个关键字。...不能创建对象 Shape s = new Box(); // 这样是可以的 Java中的密封是什么? 正如您所看到的,在引入Sealed之前,继承在Java中是一种要么全有要么全无的事情。...Java中的密封声明如下: public sealed class A permits B, C { //... } 在这个代码示例中,A可由B和C继承——或允许继承;没有其他可以继承它。...密封和子类必须位于同一个命名模块中,尽管它们可以位于不同的包中。 对于未命名的模块,密封和子类必须在同一个包中。 Java中的密封接口 密封接口的声明方式与密封几乎相同。...例如: public non-sealed interface AI extends SealedInterface{} 关于Java密封的最后思考 Java中Sealed和接口的引入为Java

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

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

    密封Java 17正式支持的一个新特性,它让Java的继承可以更加细粒度的进行控制。今天就来认识一下这个新的功能。...密封 在以往的Java继承中,Java的继承控制非常有限,仅能通过final关键字和访问控制符来控制的继承。例如final无法被集成;包私有仅仅只能在该包下进行继承。 这显然是不够的。...文章中的密封为统称 密封(接口)可以明确哪些和接口可以对其扩展或实现。你可以通过sealed修饰符来表明某个密封。..."); } } 密封子类的类型 在上面示例中,密封(接口)的实现用了final关键字标记,当然密封的实现还可以是密封: /** * 密封子类 */ public sealed...Java 17中正式转正,这也是Java 17的非常重要的特性之一。

    1.4K00

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

    Sealed Classes有两种主流翻译:密封、封闭。个人喜欢前者多一些,所以在本文中都称为密封。...下面就来一起认识一下Java 17中的Sealed Classes。 密封的作用 在面向对象语言中,我们可以通过继承(extend)来实现的能力复用、扩展与增强。...而密封的作用就是限制的继承。...新手段:密封 为了进一步增强限制能力,Java 17中的密封增加了几个重要关键词: sealed:修饰/接口,用来描述这个/接口为密封/接口 non-sealed:修饰/接口,用来描述这个.../接口为非密封/接口 permits:用在extends和implements之后,指定可以继承或实现的 下面我们通过一个例子来理解这几个关键词的用法,更多Java新特性,欢迎关注Java前沿专栏,

    70630

    学习记录——抽象密封

    如果将看做是模板,那么抽象就是一个不完整的模板,我们不能使用不完整的模板去构造对象。 抽象成员 通过在定义前面放置关键字 abstract,可以将声明为抽象。...例如,库可以定义一个抽象,将其用作多个库函数的参数,并要求使用该库的程序员通过创建派生来提供自己的实现。 抽象也可以定义抽象方法。...②密封 密封成员 通过在定义前面放置关键字 sealed,可以将声明为密封。...例如: public sealed class D { // Class members here. } 密封不能用作基。 因此,它也不能是抽象密封禁止派生。...由于密封从不用作基,所以有些运行时优化可以略微提高密封成员的调用速度。 在对基的虚成员进行重写的派生上,方法、索引器、属性或事件可以将该成员声明为密封成员。

    37131

    【JDK15 新特性】密封

    背景 在 Java 中如果想让一个不能被继承和修改,这时我们应该使用 final 关键字对进行修饰。...Java 15 尝试解决这个问题,引入了 sealed ,被 sealed 修饰的可以指定子类。这样这个就只能被指定的继承。 2....新特性 通过密封和接口来限制超的使用,密封和接口限制其它可能继承或实现它们的其它或接口。 具体使用: 使用修饰符sealed,可以将一个声明为密封。...密封使用保留关键字permits列出可以直接扩展(即extends)它的。...final:子类为finall,间接表示父不能被其他继承 sealed:子类也可以声明为密封 non-sealed:声明为非密封,可以被其他继承 举例: public abstract sealed

    45430

    为什么要把设置成密封

    前几天笔者提交了关于FasterKvCache的性能优化代码,其中有一个点就是我把一些后续不需要继承的设置为了sealed密封,然后就有小伙伴在问,为啥这个地方需要设置成sealed?...// 非密封的派生 internal class NonSealedType : BaseType { public override void Method() { } } // 密封的派生...我们可以看到 JIT 生成后的汇编代码,可以很清楚的看到密封少了两条指令,因为 JIT 可以从密封中知道它不可能被继承,也不可能被重写,所以是直接跳转到密封类目标方法执行,而非密封还有一个查表的过程...对象类型转换 (is / as) 同样有下面这样一段代码,测试密封和非密封的对象类型转换性能: public class SealedBenchmark { readonly BaseType...IL 层面,两个方法都是一模一样: 可以看到密封的代码相当高效,直接比较一下就转换类型返回了,而非密封还需要 call 方法走查表流程: 数组 .NET 的数组是协变的,协变兼容的话就意味着在添加进入数组时需要检查它的类型

    32920

    Java中有Package的如何编译运行

    最近看《java编程思想》的时候,使用javac编译了一下带package的java文件,可惜运行失败了。...不多说,下面是一个比较好的、明晰的方法: 编写一个,它是按照包的层次编码的,如果此时想通过javac和java命令来编译运行,就需要如下来做: 1.编译       编译的指令是javac      ...编译方式:文件根目录 javac 文件名.java 比如:一个文件名字:EchoClient.java           文件路径:D:\workspace\MinaTest\com\dvn\li\suntest...文件名.java  来生成package目录。 2. 运行 运行时候需要注意了,不能文件的根目录,是到文件的包目录的上层目录——可以理解为工程目录下,然后运行,文件名前需要加上包名。...运行过程: cmd 回车 D: 回车 cd D:\workspace\MinaTest回车 java   com.dvn.li.suntest.EchoClient 回车      搞定!

    1.2K40

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

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

    1.1K10

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

    Int) 2.数据声明条件 主构造函数最少要有一个参数 数据的主构造器的所有参数必须标记为val或var 数据不能是抽象、open、封闭、内部类 数据不能继承自任何其他(但可以实现接口)...(Koltin要修改数据的属性,则使用其独有的copy()函数。其作用就是:修改部分属性,但是保持其他不变) 密封 1....但是,我们知道Kotlin的枚举中的枚举常量是受限的,因为每一个枚举常量只能存在一个实例 但是其和枚举不同的地方在于,密封的一个子类可以有可包含状态的多个实例。...也可以说成,密封是包含了一组受限的集合,因为里面的都是继承自这个密封的。但是其和其他继承(open)的区别在,密封可以不被此文件外被继承,有效保护代码。...但是,其密封的子类的扩展是是可以在程序中任何位置的,即可以不在同一文件下 2.声明 sealed class SealedExpr() 内部类(嵌套) 在实际开发中,用到内部类的地方是很多的。

    1.1K20

    Java 8之后的新特性(九):密封与接口 Sealed Classes and Interfaces

    这周,我会讲到Java 8之后的一个非常重要的特性,就是密封与接口。 这个特性并不是让代码更简洁的一个点,它是让Java的设计更健壮的一个特性。如果你希望在一些特别的场景下,设计出更健壮的程序。...那密封 Sealed Class就是你不可错过的一个特性。 从继承说起 Java是一门面向对象的语言,这个是我们众所周知的,而面向对象的语言的三大重要特性就是封装,继承与多态。...如果你使用的是Java 8,除了用枚举或final class以外,只能依赖沟通与实际的非代码的约束来解决这种问题。 这就是密封与接口要解决的问题。...密封与接口 密封是这样一种概念,它在允许抽象与继承的基础之上,添加约束限制。 密封或接口,允许你对于可实现的或可继承的进行约束,以防止继承或实现被突破 还是以代码来展示更为直接。...定义一个密封密封接口的原则是: • 使用sealed关键字来修饰class,表明这是一个密封 • 使用permits关键字来对可实现的或子类进行约束 记住,或接口,都可以使用sealed关键字

    1.2K30

    JAVA中有趣的移位操作

    上次介绍了JAVA中有趣的位运算,知道了位运算是直接对一个整形的二进制位进行操作,效率上比起加减乘除高不少,因此常运用在对性能很敏感的场景。 今天介绍在二进制下的移位操作。...JAVA中也一样,存储和移位操作的都是补码,正数时都一样,负数时就要注意了。 << 左移位 在二进制格式下,把所有的数字向左移动指定位数,左边的高位移出(舍弃),右边的低位多出来的空位补0。...另一个需要注意的地方,由于Java只存储补码,正数补码和原码相同先不管,负数的补码会把原码的0变成1,所以负数左移位时,移出去的最高是1,后面怼上来的一般也是1(没到极限),所以还是负数。...11111111111111111111111111111100 (符号位除外,其余取反) // 补码: 11111111111111111111111111111101 (反码+1) // Java...左移操作相当于乘2,右移相当于除2,不全是 左移操作可能改变正负,因为符号位会被移走,新符号位不一定和以前一样 右移操作不改变符号,因为左边填充的是符号位 无符号右移会把负数变成正数 没有无符号左移 位移超过JAVA

    1.5K30
    领券