Java - JDK17语法新增特性(如果想知道Java - JDK17语法新增常见的特性的知识点,那么只看这一篇就足够了!)
前言:Java在2021年发布了最新的长期支持版本:JDK 17。这个版本引入了许多新的语法特性,提升了开发效率和代码可读性。本文将简要介绍一些常见的新特性,帮助开发者快速掌握并应用于实际开发中。
✨✨✨这里是秋刀鱼不做梦的BLOG
✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
先让我们看一下本文大致的讲解内容:

1.yield关键词
——先让我们来了解一下yield关键词的作用:
yield关键字,用于增强switch表达式,使其能够返回值。yield允许switch表达式在不同的分支中返回特定的值,并将其赋给变量。
先让我们来看一个正常的switch的例子:
public class Test {public static void main(String[] args) {String data = "one";int result = 0; // 接收数据的返回值switch (data) {case "one":result = 1; // 为result重新赋值break;case "two":result = 2; // 为result重新赋值break;default:result = -1; // 为result重新赋值break;}System.out.println(result);}
}
代码分析:
定义类和主方法:代码定义了一个名为
Test的类,并包含一个main方法,这是程序的入口点。初始化变量:声明并初始化了两个变量,
data和result。data被赋值为字符串"one",result被初始化为0。switch语句:
根据
data的值进行判断。如果
data的值是"one",则执行result = 1;,并通过break跳出switch语句。如果
data的值是"two",则执行result = 2;,并通过break跳出switch语句。如果
data的值不是"one"或"two",则执行default块,将result赋值为-1,并通过break跳出switch语句。输出结果:通过
System.out.println(result);将result的值输出到控制台。
现在让我们将上述的代码进行简化,简化后的switch:
public static void main(String[] args) {String data = "one";int result = switch (data) {case "one" -> 1;case "two" -> 2;default -> -1;};System.out.println(result);
}
我们发现我们可以使用->来返回switch语句的值,当然有读者会问了,这和我们讲解的yield有什么关系呢?,接下来让我们将上述代码转换为yield的形式:
public static void main(String[] args) {String data = "one" ;int result = switch (data) {case "one" : yield 1;case "two": yield 2;default : yield -1;};System.out.println(result) ;
}
我们可以发现我们也可以使用yield来返回switch的值,这就是yield语句。
2.var关键词
var是Java 10中引入的一个新特性,用于局部变量类型推断。它允许编译器在编译时自动推断变量的类型,从而简化代码书写和增强代码可读性。
接下来我们直接使用实例来进行讲解:
以下是一个使用var的示例:
import java.util.ArrayList;public class VarExample {public static void main(String[] args) {// 使用var声明整型变量var number = 10;System.out.println("Number: " + number);// 使用var声明字符串变量var text = "Hello, Java 10!";System.out.println("Text: " + text);// 使用var声明集合var list = new ArrayList<String>();list.add("Apple");list.add("Banana");System.out.println("List: " + list);// 使用var声明迭代器for (var item : list) {System.out.println("Item: " + item);}}
}
从上述的代码我们可以看到,我们使用var关键词来声明变量,其会自动的推断类型。这大大的方便了我们声明变量。
注意:
虽然var关键词可以推断出变量的类型,但是不要什么时候都使用var关键词来声明变量,一般在类型名称非常长的时候,例如泛型,我们会使用var来简化代码。
例如:
public static void main(String[] args) {Map<String, List<Map<Integer, String>>> complexMap = new HashMap<String,List<Map<Integer, String>>>();//使用var关键词进行简化 var complexMap2 = new HashMap<String, List<Map<Integer, String>>>();
}
我们可以发现这样我们的代码繁琐度大大的简化了。
注意事项:
-
var只能用于局部变量声明,不能用于成员变量、方法参数或返回类型。 -
变量必须在声明时初始化,因为编译器需要根据初始化值来推断变量类型。
-
var不能用于没有初始化值的变量声明。 -
var不能用于null初始化,因为无法推断类型。
以上就是Java中的var关键词的使用了。
3.密封类 - sealed
在讲解sealed关键词之前,先让我们讲解一下什么是密封类:
密封类(Sealed Classes)是一项语言特性,旨在更好地控制类层次结构中的继承关系。通过使用密封类,开发者可以明确指定哪些类可以继承某个类,从而增强类型安全性和代码可维护性。
我们知道,在Java中使用final修饰的类为密封类,其作用就是不能被其他类所继承,如果被继承就会报错,例如:
// 定义一个final类
public final class FinalClass {private String message;public FinalClass(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}// 尝试继承final类
public class SubClass extends FinalClass { // 这行会导致编译错误public SubClass(String message) {super(message);}
}
当然,在JDK17中提供了一个新的关键字: sealed 。它允许你显式地列出可以扩展某个类或实现某个接口的类,从而增强了类型安全性和可维护性。
—— 那么怎么使用sealed关键词呢?
使用sealed关键字的步骤如下:
(1)声明一个
sealed类或接口。(2)使用
permits关键字明确允许哪些类可以继承该sealed类或接口。(3)被允许的子类必须是
final,sealed,或non-sealed的。
让我们直接使用案例来帮助你进行理解:(代码如下)
// 定义一个sealed类
public sealed class Shape permits Circle, Rectangle, Square {// 声明一个抽象方法area,要求任何继承Shape的子类必须实现这个方法public abstract double area();
}// 定义一个final子类
public final class Circle extends Shape {// 声明一个私有的最终变量radius,用于存储圆的半径private final double radius;// Circle类的构造方法,接收一个半径参数并初始化radiuspublic Circle(double radius) {this.radius = radius;}// 实现Shape类中声明的抽象方法area,计算并返回圆的面积@Overridepublic double area() {return Math.PI * radius * radius;}
}// 定义一个sealed子类
public sealed class Rectangle extends Shape permits FilledRectangle {// 声明两个私有的最终变量width和height,用于存储矩形的宽和高private final double width;private final double height;// Rectangle类的构造方法,接收矩形的宽和高参数并初始化width和heightpublic Rectangle(double width, double height) {this.width = width;this.height = height;}// 实现Shape类中声明的抽象方法area,计算并返回矩形的面积@Overridepublic double area() {return width * height;}
}// 定义一个non-sealed子类
public non-sealed class Square extends Shape {// 声明一个私有的最终变量side,用于存储正方形的边长private final double side;// Square类的构造方法,接收一个边长参数并初始化sidepublic Square(double side) {this.side = side;}// 实现Shape类中声明的抽象方法area,计算并返回正方形的面积@Overridepublic double area() {return side * side;}
}// 进一步定义一个final子类
public final class FilledRectangle extends Rectangle {// 声明一个私有的最终变量color,用于存储填充矩形的颜色private final String color;// FilledRectangle类的构造方法,接收矩形的宽、高和颜色参数,并调用父类Rectangle的构造方法进行初始化public FilledRectangle(double width, double height, String color) {super(width, height);this.color = color;}// 添加一个额外的方法getColor,用于获取填充矩形的颜色public String getColor() {return color;}
}
在这个例子中:
1. Shape是一个sealed类,只有Circle,Rectangle和Square可以继承它。
2. Circle是一个final类,不能被进一步继承。
3. Rectangle是一个sealed类,只有FilledRectangle可以继承它。
4. Square是一个non-sealed类,可以被进一步继承
并且我们要注意:
1. sealed修饰的类必须要有子类;
2. 未被permits 允许的类型,则没办法继承;
3. 子类使用final修饰则不可以继承发生继承;
4. 子类使用 non-sealed 关键字修饰。表示不限制,任何类都可以继承;
5. 子类使用sealed关键词的可以继承发生继承;
这样我们就大致的了解了sealed关键词了。
4.接口中的私有方法
在接口中的私有方法常常用于对接口中的default修饰的方法和静态方法进行辅助,将其内部的代码进行封装简化。
例如:
interface HelloService {public void sayHello();// 默认方法default void saySomething(){syaEngHello();sayHello();};// 私有方法private void syaEngHello(){System.out.println("Hello!");}
接口的私有方法为Java语言引入了更多的灵活性和功能性,可以帮助编写更干净、更模块化的代码,提升了接口的设计和实现的效率和质量。
这就是Java中接口中的私有方法的使用。
5.instanceof关键词
在Java中,instanceof是一个关键字,用于测试一个对象是否是一个类的实例或者是其子类的实例。它的语法形式如下:
object instanceof type
其中,object是要检查的对象,type是一个类名或接口名。instanceof操作符的作用是检查object是否是type类型的实例,或者是type类型的子类的实例。它返回一个布尔值,如果object是type类型或其子类的实例,则返回true;否则返回false。
——接下来让我们使用一个实例来进行对其进一步理解:
class Animal {// Animal 类的成员和方法
}class Dog extends Animal {// Dog 类的成员和方法
}public class Main {public static void main(String[] args) {Animal animal = new Dog(); // 创建一个 Dog 对象并赋值给 Animal 类型的变量// 使用 instanceof 来检查对象的类型if (animal instanceof Dog) {System.out.println("animal 是 Dog 类的实例");}if (animal instanceof Animal) {System.out.println("animal 是 Animal 类的实例");}if (animal instanceof Object) {System.out.println("animal 是 Object 类的实例");}}
}
解释:
-
Animal是一个类,Dog是Animal的子类。 -
在
main方法中,创建了一个Dog对象,并将其赋值给一个Animal类型的变量animal。 -
使用
instanceof关键字,首先检查animal是否是Dog类的实例,结果为true,因为animal确实是Dog类的实例。 -
接着检查
animal是否是Animal类的实例,同样为true,因为Dog类是Animal类的子类。 -
最后检查
animal是否是Object类的实例,结果同样为true,因为所有类在Java中最终都是继承自Object类的。
通过上面的讲解,我相信你已经对Java中instanceof关键词有了一定的理解,那么instanceof关键词有什么用处呢?
instanceof的用途:
-
类型检查和转换:
instanceof通常用于在运行时检查对象的类型,以便进行类型转换或根据对象的实际类型执行特定的操作。 -
条件控制:可以根据对象的类型来决定执行不同的代码路径,以实现多态性和灵活的程序逻辑。
-
安全性检查:在某些情况下,使用
instanceof可以帮助避免类型转换异常(ClassCastException),在进行类型转换之前先检查对象的类型是否符合预期。
这样我们就大致的了解了Java中的instanceof关键词了。
以上就是本篇文章的全部内容了~~~
相关文章:
Java - JDK17语法新增特性(如果想知道Java - JDK17语法新增常见的特性的知识点,那么只看这一篇就足够了!)
前言:Java在2021年发布了最新的长期支持版本:JDK 17。这个版本引入了许多新的语法特性,提升了开发效率和代码可读性。本文将简要介绍一些常见的新特性,帮助开发者快速掌握并应用于实际开发中。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨…...
Linux-DNS
DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。…...
使用gitlab的CI/CD实现logseq笔记自动发布为单页应用
使用gitlab的CI/CD实现logseq笔记自动发布为单页应用 使用gitlab的CI/CD实现logseq笔记自动发布为单页应用如何实现将logseq的笔记发布成网站使用 logseq-publish-docker 实现手动发布使用gitlab的CI/CD实现自动发布过程中的问题及解决参考资料 使用gitlab的CI/CD实现logseq笔记…...
云联壹云 FinOps:赋能某车企公有云成本管理与精细化运营
背景 某车企,世界 500 强企业,使用了大量的公有云资源,分布于多家公有云,月消费在千万级别。 业务线多且分散,相关的云消耗由一个核心团队进行管理,本次案例的内容将围绕这些云成本的管理展开的。 需求 …...
C#静态类与非静态类
1、静态类 静态类有几个重要的特点: 1)无法实例化:由于静态类不能被实例化,因此它不会占用对象内存。 2)静态成员:静态类只能包含静态成员(静态方法、静态属性、静态事件等)。 3&am…...
亚信安全:《2024云安全技术发展白皮书》
标签 云计算 安全威胁 云安全技术 网络攻击 数据保护 一句话总结 《云安全技术发展白皮书》全面分析了云计算安全威胁的演进,探讨了云安全技术的发展历程、当前应用和未来趋势,强调了构建全面云安全防护体系的重要性。 摘要 云安全威胁演进ÿ…...
GuLi商城-商品服务-API-品牌管理-云存储开通与使用
这里学习下阿里云对象存储 地址:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号,找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS...
git 命令行初始化并上传项目
XXXX 为项目名称 1. 初始化 cd D:\XXXX git init git remote add origin http://账号192.168.1.231:8088/r/XXXX.git 2. 拉取项目,做本地合并 git pull origin master git fetch origin git merge origin/master 3. 添加注释,上传 git add . git c…...
Spring框架Mvc(2)
1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 ,测试结果 3.用Json来对其进行数据的传递 (1)Json是一个经常使用的用来表示对象的字符串 (2)Json字符串在字符串和对象…...
Python学习笔记29:进阶篇(十八)常见标准库使用之质量控制中的数据清洗
前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…...
【LLM】一、利用ollama本地部署大模型
目录 前言 一、Ollama 简介 1、什么是Ollama 2、特点: 二、Windows部署 1.下载 2.安装 3.测试安装 4.模型部署: 5.注意 三、 Docker部署 1.docker安装 2.ollama镜像拉取 3.ollama运行容器 4.模型部署: 5.注意: 总结 前言…...
Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序
Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序 SSM 新生报到系统小程序 功能介绍 学生 登录 注册 忘记密码 首页 学校公告 录取信息 录取详情 师资力量 教师详情 收藏 评论 用户信息修改 宿舍安排 签到信息 在线缴费 教室分配 我的收藏管理 我要发贴 我的发贴 管理…...
玩转云服务:Oracle Cloud甲骨文永久免费云服务器注册及配置指南
上一篇,带大家分享了:如何薅一台腾讯云服务器。 不过,只有一个月免费额度,到期后需要付费使用。 相对而言,海外云厂商更加慷慨一些,比如微软Azure、甲骨文、亚马逊AWS等。 甲骨文2019年9月就推出了永久免…...
Zabbix——宏
目录 宏的类型 常用宏 定义和使用宏 宏的优先级 使用宏的示例 在 Zabbix 中,宏(Macros)是一个非常强大的功能,允许你在监控配置中使用动态变量。宏可以在各种配置项中使用,例如触发器、动作、通知、图形和模板等。…...
Unity 简单载具路线 Waypoint 导航
前言 在游戏开发和导航系统中,"waypoint" 是指路径中的一个特定位置或点。它通常用于定义一个物体或角色在场景中移动的目标位置或路径的一部分。通过一系列的 waypoints,可以指定复杂的移动路径和行为。以下是一些 waypoint 的具体用途&…...
科普文:微服务之服务网格Service Mesh
一、ServiceMesh概念 背景 随着业务的发展,传统单体应用的问题越来越严重: 单体应用代码库庞大,不易于理解和修改持续部署困难,由于单体应用各组件间依赖性强,只要其中任何一个组件发生更改,将重新部署整…...
第四十九章 解决 IRIS 中的 SOAP 问题 - 发送消息时出现问题
文章目录 第四十九章 解决 IRIS 中的 SOAP 问题 - 发送消息时出现问题 第四十九章 解决 IRIS 中的 SOAP 问题 - 发送消息时出现问题 如果在向 IRIS Web 服务或客户端发送或接收 SOAP 消息时遇到问题,请考虑以下常见场景列表: SOAP 消息可能包含极长的字…...
STM32-HAL-FATFS(文件系统)(没做完,stm32f103zet6(有大佬的可以在评论区说一下次板子为什么挂载失败了))
1STM32Cube配置 1-1配置时钟 1-2配置调试端口 1-3配置uart 1-4配置SDIO(注意参数)(其中他的初始化的异常函数给注释,SD卡文件写了) 配置了还要打开中断和DMA可在我的其他文章中看一样的 1-5配置FatFs (只改了图选中…...
线性代数基础概念:矩阵
目录 线性代数基础概念:矩阵 1. 矩阵的定义 2. 矩阵的运算 3. 矩阵的特殊类型 4. 矩阵的秩 5. 矩阵的初等变换 6. 矩阵的特征值与特征向量 7. 矩阵的应用 8. 矩阵总结 总结 线性代数基础概念:矩阵 矩阵是线性代数中的另一个重要概念࿰…...
【优化论】约束优化算法
约束优化算法是一类专门处理目标函数在存在约束条件下求解最优解的方法。为了更好地理解约束优化算法,我们需要了解一些核心概念和基本方法。 约束优化的核心概念 可行域(Feasible Region): 比喻:想象你在一个园艺场…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

