jdk15至17——sealed密封关键字

这篇具有很好参考价值的文章主要介绍了jdk15至17——sealed密封关键字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

sealed关键字是从jdk15开始预览,直到jdk17成为正式版,可以对继承父类和实现接口进行更加细粒度的限制,之前的限制也只有final用于禁止继承,默认包权限限制在同一个包内,sealed密封类/接口可以明确指定哪些类可以进行继承和实现;

跟sealed相关的关键字除了之前的final,还有新增的non-sealed和permits:

  • permits:用于明确指定允许继承的子类和实现类,且不能使用匿名类动态类,书写位置在extends/implements后面(大概是放最后面);
  • sealed:指定类/接口为密封类/接口,后面必须使用permits指定子类/实现类;
  • final:指定类为最终类,不能被继承;
  • non-sealed:解除密封性,指定为普通类关系;

sealed可以修饰类也可以修饰接口,密封类的子类必须使用sealed、final、non-sealed其中之一修饰,sealed修饰的子类继续密封,后面继续使用permits指定,final修饰的子类为最终类,不能被继承,non-sealed修饰的子类密封性解除,后续可以当普通类使用;

permits指定的允许类为直接指定,不具有传递性;

代码展示:

package test;

public class MainTest {
	
	//密封类A只能被A1,A2,A3继承
	public sealed class A permits A1, A2, A3 {}
	//A1为final类,不能继续被继承
	public final class A1 extends A {}
	//A2使用non-sealed修饰,解除密封限制可被任何类继承
	public non-sealed class A2 extends A {}
	//A3仍为密封类,需要继续用permits指定可继承类
	public sealed class A3 extends A permits B {}
	
	public final class B extends A3 {}
	
//	public final class A4 extends A {}	//报错,A4未被A指定未可继承类
	
	public class C extends A2 {}	//任何类都可继承A2
	
	public static void main(String[] args) {
		
	}
	
}

另外,sealed类和子类/实现类,可以在同一个包下,也可以在不同的包下,但是必须在同一个模块下,如果使用未命名的模块,则必须在同一个包里;

需要在不同包里使用时需要建一个命名的模块:

jdk15至17——sealed密封关键字

另外,由于record类型最后编译成final类并且不支持继承和被继承,所以可以跟sealed接口一起使用,使代码更简介:

package test;

public class MainTest {
	
	public sealed interface A permits B, C {
		public void fun();
	}

	public record B(String s) implements A {
		@Override
		public void fun() {
			System.out.println("B fun:" + s);
		}
	}

	public record C(int i) implements A {
		@Override
		public void fun() {
			System.out.println("C fun:" + i);
		}
	}
	
	public static void main(String[] args) {
		A b = new B("abc");
		A c = new C(321);
		b.fun();
		c.fun();
	}
	
}

jdk15至17——sealed密封关键字文章来源地址https://www.toymoban.com/news/detail-459006.html

到了这里,关于jdk15至17——sealed密封关键字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 搜索引擎优化指南:SEO关键字、长尾关键字、短尾关键字以及反向链接

    SEO 代表“搜索引擎优化”。它是一种数字营销策略,旨在提高网站或网页在搜索引擎未付费结果中的在线可见性。通常,网站在搜索结果页面中排名越高,或在搜索结果列表中显示的频率越高,它将从搜索引擎用户那里获得的访问者就越多。 SEO 策略可以针对各种类型的搜索

    2024年02月04日
    浏览(148)
  • 【iOS】—— 属性关键字及weak关键字底层原理

    参考博客:IOS开发基础——属性(copy strong weak等) 内存管理有关的: weak , assign , strong , retain , copy 线程安全有关的的: nonatomic , atomic 访问权限有关的的: readonly , readwrite (只读,可读写) 修饰变量的: const , static , extern 这些

    2024年02月16日
    浏览(42)
  • 拼多多关键字搜索API-通过关键字获取拼多多商品列表

    pinduoduo.item_search 公共参数 请求地址: pinduoduo/item_search 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secret String 是 调用密钥 api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等] cache String 否 [yes,no]默认yes,将调用缓存的数据

    2024年02月22日
    浏览(82)
  • 【Java入门】final关键字、static关键字、内部类的认识

    前言 : final是Java中的一个修饰符,用于表示某个变量、方法或者类不能被修改。final可以用于修饰类、方法和变量(局部变量,成员变量)。被final所修饰的类不能被继承,被final所修饰的方法不能被重写,被final所修饰的变量,不能被重新赋值 。 static是Java中的一

    2024年02月11日
    浏览(55)
  • ElasticSearch nested 字段多关键字搜索,高亮全部匹配关键字的处理

    ElasticSearch 版本号: 6.7.0 用户会传入多个去ES查询 ElasticSearch nested 字段 的多个字段,要求在返回的结果中被搜索的字段需要高亮所有匹配的。例如同时通过 上海 和 策划 ,再 工作经历 的列表中的 工作内容 和 公司名称 中搜索。如果有人员的 工作经历 中

    2024年04月22日
    浏览(59)
  • 用python实现给出关键字查找并标注pdf文件中关键字

    要在Python中标注PDF文件中的,可以使用Python的PDFMiner库和Python的matplotlib库。 首先,需要安装这两个库。可以使用pip命令进行安装: shell 复制代码 pip install pdfminer.six matplotlib 接下来,可以使用以下代码实现查找和标注功能: python 复制代码 import pdfminer   from pdf

    2024年01月16日
    浏览(71)
  • Java面向对象——多态、Object类、instanceof关键字以及final关键字

    总之,多态是面向对象编程中一个非常重要的概念,通过它可以实现统一的接口来操作不同的对象,提高代码的可读性和可维护性。在实际编程中,多态性的使用可以使代码更加灵活和扩展性更强。方法重写是实现多态的基础。 重写如下所示 关于hashCode方法的重写: 重写t

    2024年02月12日
    浏览(70)
  • ES6中let和const关键字与var关键字之间的区别?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月09日
    浏览(55)
  • 【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

    在C语言中,同名函数是不能出现在同一作用域的,但是在C++中却可以,但是要满足函数重载的规则。 那什么是函数重载呢?它的规则是什么呢? 函数重载 :是函数的一种特殊情况,C++允许在 同一作用域 中声明几个功能类似的 同名函数 ,这些同名函数的 形参列表(参数个数

    2024年04月26日
    浏览(55)
  • 【iOS】属性关键字

    先前已经在iOS的学习过程中学习了一些属性的简单用法,今天这篇博客来 更加深入探讨 iOS中的属性 以及 温习深拷贝与浅拷贝 OC对象(集合类型和非集合类型)有2种拷贝方式,分别为浅拷贝和深拷贝。 浅拷贝:指针拷贝,即源对象和副本对象的指针 指向了同一个

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包