JDK17新增语法特性

JDK17新增语法特性

  • 前言
  • 新增语法特性
    • yield关键字
    • var关键字
    • 密封类
    • 接口中的私有方法
    • instanceof
    • 其他

前言

从springboot3.0开始,已经不支持JDK8,转变为JDK17
参考资料: 官方博客

新增语法特性

yield关键字

yield关键字从JDK13开始引入,yield关键字用于从case的代码块中返回值。
正常的switch语句:

public class Test {public static void main(String[] args) {String data = "ONE";int ret;switch(data){case "ONE":ret = 1;break;case "TWO":ret = 2;break;case "THREE":ret = 3;break;default:ret = -1;break;}System.out.println(ret);}//结果是://1
}

简化后的switch语句

public class Test {public static void main(String[] args) {String data = "TWO";int ret = switch(data){case "ONE"->1;case "TWO"->2;case "THREE"->3;default->-1;};System.out.println(ret);}//结果是://2
}

如果不想使用指向符->可以使用yield来代替:

public class Test {public static void main(String[] args) {String data = "TWO";int ret = switch(data){case "ONE" : yield 1;case "TWO" : yield 2;case "THREE": yield 3;default: yield -1;};System.out.println(ret);}//结果是://2
}

var关键字

从java10开始,var被引入

var name = "zhangsan";
var age = 10;

上述代码中, 编译器会自动推断出name是一个String类型,age是一个int类型。
为什么使用var?
使用var可以使代码更简洁,有时候,类型的名称可能会非常长,例如泛型。var就像是一个简化器,让你不必反复写出繁琐的类型名。

public class Test {public static void main(String[] args) {Map<String, List<Map<Integer, String>>> complexMap = new HashMap<String,List<Map<Integer, String>>>();var complexMap2 = new HashMap<String, List<Map<Integer, String>>>();}
}   

使用注意事项:

  • 不能使用var来声明字段
  • 不能使用var来声明方法参数
  • 不能使用var来声明方法返回类型
  • var声明变量必须初始化,但是不能初始化为null
class Cat{public var name;    //errorpublic var eat(var str){    //error}public static void main(String[] args) {var a = 1;System.out.println(a);var b = null;   //error}
}

密封类

密封类一般应用在类和接口中,对接口和类的实现和继承进行约束,主要使用的关键字是final,当这个类被final修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承。
JDK17提供了一个关键字:sealed。密封类除了可以被该关键字修饰,并且在声明末尾使用permits表示要开放给哪些类型。
下述代码Animal为密封类,然后用permits关键字,把继承权限开放给Dog类

sealed class Animal permits Dog{public String name;public int age;public void eat(String name){System.out.println(name + "正在吃......");}
}
//继承的类也要加上密封限制 non-sealed 表⽰不限制
non-sealed class Dog extends Animal{public void eat(String name){System.out.println(name + "正在吃狗粮");}
}

注意:

  • sealed修饰的类必须有子类
sealed class Animal permits Dog{public String name;public int age;public void eat(String name){System.out.println(name + "正在吃......");}
}
sealed class Dog extends Animal{public void eat(String name){System.out.println(name + "正在吃狗粮");}
}
//编译器报错:Sealed class must have subclasses,此时Dog被sealed修饰,那么Dog必须要有子类
  • 使用non-sealed关键字修饰。表示不限制,任何类都可以继承。
sealed class Animal permits Dog{public String name;public int age;public void eat(String name){System.out.println(name + "正在吃......");}
}
//继承的类也要加上密封限制 non-sealed 表⽰不限制
non-sealed class Dog extends Animal{public void eat(String name){System.out.println(name + "正在吃狗粮");}
}
  • 未被permits允许的类型,则没办法继承
sealed class Animal permits Dog{public String name;public int age;public void eat(String name){System.out.println(name + "正在吃......");}
}
non-sealed class PetDog extends Animal{}
//编译器报错:'PetDog' is not allowed in the sealed hierarchy

正确的做法可以改为:

sealed class Animal permits Dog,PetDog{public String name;public int age;public void eat(String name){System.out.println(name + "正在吃......");}
}
non-sealed class Dog extends Animal{public void eat(String name){System.out.println(name + "正在吃狗粮");}
}
non-sealed class PetDog extends Animal{}
  • 复杂的特殊写法:
sealed class Animal permits Dog,PetDog,Cat{public String name;public int age;public void eat(String name){System.out.println(name + "正在吃......");}
}
sealed class Cat extends Animal permits PetCat{
}
non-sealed class PetCat extends Cat{
}

接口中的私有方法

public interface IHelloService {public void sayHello();//默认方法default void saySomething(){sayHello();sayEngHello();}//私有方法private void sayEngHello(){System.out.println("Hello!");}
}

instanceof

比如以下常见的代码:

if(obj instanceof String){String str = (String)obj;...

上面的instanceof一共做了三件事:

  1. 判断是否为String类型;
  2. 如果是,转换成String类型;
  3. 创建一个名为str的临时变量;

在JDK16中,使用模式匹配思想改进了instanceof用法,可以做到以下优化效果:

if(obj instanceof String str){	//obj是否为String类型,如果是创建临时变量str}

其他

还有很多,需要我们后续继续了解和学习

  • ZGC-新一代垃圾回收器、G1垃圾回收器相关等等
  • record类的使用
  • Stream API的部分改进
  • HttpClient重写了,支持HTTP2.0
  • 支持了List.of()、Set.of()、Map.of()和Map.ofEntries()等⼯⼚⽅法实例化对象
  • 等等…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144794.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32红外感应的自动迎客人语音控制系统设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

相图数据对于纳米材料研究的积极作用

纳米材料因其独特的物理、化学和生物学特性&#xff0c;在环境保护&#xff0c;能源领域&#xff0c;生物医学&#xff0c;航空航天等多个领域展现出广泛的应用潜力。在纳米材料合成过程中&#xff0c;通过相图可以识别出在特定温度和压力下材料的稳定相和不稳定相&#xff0c;…

git第一次首次提交本地代码到远程仓库详细步骤(初始化提交)

参考文章 &#xff1a;https://blog.csdn.net/qq_22182989/article/details/139098265 假如报错关联git仓库出现的问题。 error: remote origin already exists.解决方案&#xff1a; 1、先输入git remote rm origin 删除关联的origin的远程库 2、关联自己的仓库 git remote a…

文心一言 VS 讯飞星火 VS chatgpt (351)-- 算法导论24.1 2题

二、证明推论24.3。推论 24.3 的内容是设 G ( V , E ) G(V,E) G(V,E)是一带权重的源结点为 s s s的有向图&#xff0c;其权重函数为 ω : E → R ω:\boldsymbol{E→R} ω:E→R。假定图 G G G不包含从源结点 s s s可以到达的权重为负值的环路&#xff0c;则对于所有结点 v ∈ …

mat (Eclipse Memory Analyzer Tool)使用以及详解

前言 在Java开发中&#xff0c;内存问题往往不易被发现&#xff0c;但它们可能导致应用性能下降甚至崩溃。Eclipse Memory Analyzer Tool&#xff08;MAT&#xff09;是一个强大的开源工具&#xff0c;专门用于分析Java堆转储&#xff08;heap dumps&#xff09;文件&#xff…

js 将二进制文件流,下载为excel文件

吃西瓜 现成的粒子 二进制流&#xff0c;是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同&#xff0c; 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频、可执行文件、压缩文件等&#xff0c;而文本文…

Acwing Hash表

哈希表的作用&#xff1a;把一个比较大的空间&#xff0c;通过一个函数映射到一个比较小的空间 一般做哈希运算时&#xff0c;取一个质数作为模&#xff0c;会使得冲突的概率降低。 哈希表的冲突解决方法&#xff1a; 拉链法开放寻址法 下面详细介绍这两种方法的原理及其实现…

自制网络连接工具(支持tcpudp,客户端服务端)

自制网络连接工具&#xff08;支持tcp/udp,客户端/服务端&#xff09; 将网络连接工具制作成共享库 network.h #ifndef NETWORK_H #define NETWORK_H#include<netinet/in.h> #include<sys/socket.h> #include<stdbool.h> typedef struct Network {int type…

JAVA基础:包装类,BigInteger , BigDecimal

1 包装类 java是一种面向对象的编程语言 对象都是由类产生的。 8种基本类型对java面向对象的特性有所破坏 jdk就提供了8种基本类型所对应的类的表示&#xff0c;称为&#xff1a;包装类 理论上来讲&#xff1a;类属性使用包装类定义&#xff0c;方法中的局部变量使用基本类型…

javamail发邮件:配置SMTP发送邮件的步骤?

javamail发邮件的教程指南&#xff1f;怎么用JavaMail发送邮件&#xff1f; JavaMail API 是 Java 平台上用于发送和接收电子邮件的标准 API&#xff0c;它提供了一套丰富的类和方法&#xff0c;使得开发者能够轻松地实现邮件发送功能。AokSend将详细介绍如何使用 JavaMail AP…

基于atlas环境下YOLOV7的睡岗识别

做到这里&#xff0c;其实只是想探索下新的检测框架、探索下atlas下ACL的推理方式。整个过程持续了3-4周把&#xff0c;回顾一下&#xff0c;感觉还是需要一些技巧才能拿下&#xff0c;如果没有任何经验的是断难搞定此代码的。主要基于华为的官方例子&#xff0c;里面修改了原始…

峟思科普:溢流坝是什么?溢流坝承载着哪些作用

水坝系统中的一项关键组成部分——溢洪结构&#xff0c;又常被称作溢洪道&#xff0c;其独特功能在于精准调控水库水位&#xff0c;确保水坝安全。当水库蓄水量超过预设阈值&#xff0c;该结构能够引导多余水流平稳穿越坝体&#xff0c;注入下游河床。此过程中&#xff0c;坝前…

Snapchat API 访问:Objective-C 实现示例

Snapchat 是一个流行的社交媒体平台&#xff0c;它允许用户发送和接收短暂存在的图片和视频。对于开发者来说&#xff0c;访问 Snapchat API 可以为应用程序添加独特的社交功能。本文将介绍如何在 Objective-C 中实现对 Snapchat API 的访问&#xff0c;并提供一个详细的代码示…

uni-app页面调用接口和路由(四)

文章目录 一、路由二、页面调用接口二、路由跳转1.uni.navigateTo(OBJECT)2.uni.redirectTo(OBJECT)3.uni.reLaunch(OBJECT)4.uni.switchTab(OBJECT)5.uni.navigateBack(OBJECT) 总结 一、路由 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配…

yolo自动化项目实例解析(四)ui页面整理1 (1.85)

我们在上一章整理main.py 的if __name__ __main__: 内容还留下面这一段&#xff0c; from PyQt5.QtWidgets import *from lanrenauto.moni.moni import *from PyQt5.QtGui import *app QApplication(sys.argv) # 初始化Qt应用ratio screen_width / 2560 # 分辨率比例# 设…

centos 安装VNC,实现远程连接

centos 安装VNC&#xff0c;实现远程连接 VNC(Virtual Network Computing)是一种远程控制软件&#xff0c;可以实现通过网络远程连接计算机的图形界面。 服务器安装VNC服务 yum install -y tigervnc-server*启动VNC服务&#xff0c;过程中需要输入连接密码 vncserver :1查看…

全国网安众测招募计划启动啦,欢迎加入~

在数字化时代&#xff0c;网络安全已成为维护社会稳定、促进经济发展的基石。为了积极响应国家关于加强网络安全工作的号召&#xff0c;确保某区域关键信息系统的稳固运行&#xff0c;我们特此启动一项网络安全众测活动。该活动旨在通过汇聚业界有经验的网络安全攻防人才&#…

RetrievalAttention——提高 LLM 处理长上下文的效率

概述 论文地址&#xff1a;https://arxiv.org/abs/2409.10516 本文的研究背景主要是为了解决 "具有长语境的大型语言模型&#xff08;LLM&#xff09;"问题。基于变换器的 LLM 被广泛应用于各个领域&#xff0c;但在处理长上下文时&#xff0c;其计算成本非常高。特…

电脑USB端口禁止软件有哪些?什么软件能指定USB端口禁用?分享四款好用软件!

想象一下&#xff0c;你正准备在办公桌上插入U盘&#xff0c;打算快速拷贝文件&#xff0c;突然系统蹦出一个警告&#xff1a;“这个USB端口已被禁用&#xff01;” 是不是感觉好像被一双隐形的手制止了&#xff1f; 其实&#xff0c;这双“隐形的手”就是专门为企业安全设计…

visionpro脚本

visionproToolBlock的脚本的优先级优于工具连线的优先级&#xff0c;一般是照着脚本的执行顺序进行执行对应的工具&#xff0c;最常用的是C#的高级脚本&#xff0c;C#的脚本如下分为5部分。 第一部分&#xff1a;主要是一些库的引用&#xff0c;对于有些类型不知道库的时候&…