Java 新特性探索:从 JDK9 到 JDK17 的关键改进与示例代码

JDK 新特性

JDK9

jshell 交互式工具

  • 引入了一个交互式的编程工具,可以在命令行中(cmd)直接执行和测试 Java 代码片段。
// 示例1:在jshell中执行简单的Java代码
jshell> int a = 10;
a ==> 10jshell> int b = 20;
b ==> 20jshell> int sum = a + b;
sum ==> 30// 示例2:定义一个简单的方法
jshell> void greet(String name) {...>     System.out.println("Hello, " + name + "!");...> }
|  created method greet(String)jshell> greet("Alice");
Hello, Alice!jshell> greet("Bob");
Hello, Bob!

模块化开发

  • 引入了模块系统,将代码划分为模块,以提高可维护性、安全性和性能。

JDK10

var 局部变量推导

  • 引入了 var 关键字,可以根据初始化值的类型自动推导出变量的类型。
// 示例1:使用var进行局部变量推导
var message = "Hello, World!";
System.out.println(message);// 示例2:与集合框架一起使用
var numbers = List.of(1, 2, 3, 4, 5);
for (var number : numbers) {System.out.println(number);
}// 示例3:与Lambda表达式一起使用
var runnable = (Runnable) () -> {System.out.println("Running...");
};
runnable.run();

JDK11

单文件程序

  • 可以直接在命令行中运行单个 Java 源文件,无需显式地编译为字节码文件。

  • 可在【命令行工具】,直接运行 java 文件,例如 java TestB. java

  • 注意:无法识别 import 语句,需要先删除再执行运行语句

// 示例:直接运行单个Java源文件
public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}// 在命令行中执行以下命令
java HelloWorld.java

shebang 脚本

  • 支持在 Java 源文件中使用 shebang(#!)来指定解释器,使得 Java 程序可以像脚本一样直接执行。

  • #! 符号叫做 shebang,可音译成:释伴,解释伴随行。

  • #i/bin/bash 以此开头的文件,在执行时会实际调用 /bin/bash 程序来执行

JDK14

instanceof 增强

  • 增强了 instanceof 运算符,使其可以在【条件表达式】中直接获取转换后的类型。
// 示例:使用instanceof判断对象类型
Object obj = "Hello";if (obj instanceof String str) { // 这里相当于将 obj 赋值给了 strSystem.out.println("Length: " + str.length());
} else {System.out.println("Not a string");
}

空指针提示

  • 报空指针异常时,会具体到显示是哪个变量为 null,而 JDK8 的只会显示哪一行报空指针异常。

JDK16

record 类

  • 引入了 record 关键字,可以更方便地定义不可变的数据类,自动生成常用方法构造函数equalshashCode 等。
// 示例:定义一个record类
record Person(String name, int age) {}// 创建一个Person对象
Person person = new Person("Alice", 25);// 访问record类的属性
System.out.println(person.name());
System.out.println(person.age());

JDK17

sealed 类

  • 引入了 sealed 关键字,用于限制哪些类可以继承或实现某个类或接口,增强了类的封装性和安全性。

核心关键字含义:

  1. sealed:sealed 是 Java 17 引入的关键字,用于修饰类或接口。当一个类或接口被声明为 sealed 时,它的子类或实现类必须显式地声明在 permits 子句中,否则无法继承或实现该类或接口。
  2. non-sealed:non-sealed 是与 sealed 相对的概念。当一个类或接口声明为 non-sealed 时,它可以被任意类或接口继承或实现,而不需要显式地声明在 permits 子句中。
  3. final:被 final 修饰的类不可继承,即不能有子类。
  4. permits:permits 是 sealed 关键字后的一个子句,用于指定允许继承或实现的类或接口。在 permits 子句中列出的类或接口是被允许继承或实现 sealed 类或接口的类或接口。

以下是一个简单的代码示例:

// 定义一个 sealed 类
sealed class Shape permits Circle, Rectangle, Triangle {abstract double area();
}// 定义 Circle 类作为 Shape 的子类
final class Circle extends Shape {private final double radius;Circle(double radius) {this.radius = radius;}@Overridedouble area() {return Math.PI * radius * radius;}
}// 定义 Rectangle 类作为 Shape 的子类
final class Rectangle extends Shape {private final double length;private final double width;Rectangle(double length, double width) {this.length = length;this.width = width;}@Overridedouble area() {return length * width;}
}// 定义 Triangle 类作为 Shape 的子类
final class Triangle extends Shape {private final double base;private final double height;Triangle(double base, double height) {this.base = base;this.height = height;}@Overridedouble area() {return 0.5 * base * height;}
}public class SealedClassExample {public static void main(String[] args) {// 创建不同形状的对象并计算面积Shape circle = new Circle(5.0);Shape rectangle = new Rectangle(4.0, 6.0);Shape triangle = new Triangle(3.0, 8.0);System.out.println("Circle Area: " + circle.area());System.out.println("Rectangle Area: " + rectangle.area());System.out.println("Triangle Area: " + triangle.area());}
}

代码解释:

在这个示例中,Shape 类被声明为 sealed 类,并且明确声明了允许的子类(CircleRectangleTriangle)。这样的设计可以更好地控制类的继承关系,并提高代码的可维护性。

switch 模式匹配

JDK 17 引入了一种新的 switch 语句的模式匹配功能,它允许在 switch 语句中使用模式来进行更灵活的匹配。这种模式匹配的语法使得在 switch 语句中处理复杂的条件逻辑更加简洁和易读。

以下是一个示例代码:

public class PatternMatchingSwitch {public static void main(String[] args) {Object value = "Hello";// 在 switch 表达式中使用模式匹配String result = switchExpressionExample(value);System.out.println(result);}private static String switchExpressionExample(Object value) {return switch (value) {case String s -> "It's a String: " + s.length();case Integer i && (i > 0) -> "It's a positive Integer: " + i;case Integer i && (i < 0) -> "It's a negative Integer: " + i;case Double d -> "It's a Double: " + d;default -> "Unknown type";};}
}

代码解释

  • 在这个示例中,使用了不同的模式来匹配不同的对象类型和条件。
  • 这包括字符串长度、正整数、负整数和双精度浮点数。
  • 使用模式匹配可以使代码更加清晰和简洁。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm人事管理信息系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本人事管理信息系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

JPA与MySQL锁实战

前言&#xff1a;最近使用jpa和mysql时&#xff0c;遇到了死锁问题。在解决后将一些排查过程中新学到和复习到的知识点再总结整理一下。首先对InnoDB中锁相关的概念进行介绍&#xff0c;然后展示如何利用JPA提供的排他锁来实现想要的功能&#xff0c;最后对死锁问题进行讨论。 …

MISRA C++ 2008 标准解析

MISRA C 2008是《汽车专用软件的C语言编程指南》&#xff0c;是针对C语言的安全编码标准&#xff0c;适用C 03标准&#xff0c;是汽车行业公认的C语言编码规范&#xff0c;目的是在研发生命周期早期发现软件中的缺陷&#xff0c;预防成本投入会大幅度降低投产后的售后维护成本。…

大屏适配方案一scale()

背景 在做大屏可视化项目的时候&#xff0c;一般设计稿会设计成1920 * 1080&#xff0c;但是页面写死1920 * 1080在2k、4k等分辨率的屏幕下是不适配的。 方案一&#xff1a;css3的缩放属性transform以及scale() 在做项目之前我们需要搞清楚客户的数据可视化平台需要在什么屏幕…

rocketMQ介绍

作用 流量削峰系统解耦 功能 普通消息 同步消息异步消息事务消息顺序消息延迟消息订阅与发布消息过滤消息消费重试死信队列...... 架构设计 1个broker是1台实例每个broker都有从节点&#xff0c;便于做故障转移每个broker对应一个文件&#xff0c;存储数据&#xff1f;还是…

PPOCRv3检测模型和识别模型的训练和推理

PPOCRv3检测模型和识别模型的训练和推理 文章目录 PPOCRv3检测模型和识别模型的训练和推理前言一、环境安装1&#xff0c;官方推荐环境&#xff1a;2&#xff0c;本机GPU环境 二、Conda虚拟环境1.Win10安装Anaconda32.使用conda创建虚拟环境 三、安装PPOCR环境1&#xff0c;安装…

数据可视化免费化的双面影响探析

近年来数据可视化的免费化也越来越明显&#xff0c;今天就以我作为可视化设计师的经验来和大家分析一下&#xff0c;数据可视化工具免费化所带来的利与弊。 先从好处入手&#xff0c;最明显的就是免费化可以让数据可视化工具得到更广泛的使用。 免费数据可视化工具使得更多人可…

生命在于折腾——使用PD打开OVA格式虚拟机

一、前言 下载了一个封装的工具箱虚拟机&#xff0c;格式是OVA的&#xff0c;PD无法直接打开&#xff0c;之前成功转换后打开过&#xff0c;但那时候没有记录&#xff0c;今天记录一下。 二、过程 有两种方法 1、去vmware官网下载工具VMware OVF Tool 地址&#xff1a;htt…

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 二维数组处理01背包问题 听起来…

大屏图表汇总echarts圆环

圆环效果示例 代码如下 storageStaChart() {let color [#009976,#15E6B5]let charts echarts.init(document.getElementById(storageStaChart));let option this.getPieOption(color);charts.setOption(option, true);}, getPieOption(color) {let data [];data.push({val…

Java高级技术-单元测试

单元测试 Junit单元测试框架 Junit单元测试-快速入门 方法类 测试类 Junit框架的基本注解

[Geek Challenge 2023] web题解

文章目录 EzHttpunsignn00b_Uploadeasy_phpEzRceezpythonezrfi EzHttp 按照提示POST传参 发现密码错误 F12找到hint&#xff0c;提示./robots.txt 访问一下&#xff0c;得到密码 然后就是http请求的基础知识 抓包修改 最后就是 我们直接添加请求头O2TAKUXX: GiveMeFlag 得到…

FPGA高端项目:UltraScale GTH + SDI 视频编解码,SDI无缓存回环输出,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、详细设计方案设计框图3G-SDI摄像头LMH0384均衡EQUltraScale GTH 的SDI模式应用UltraScale GTH 基本结构参考时钟的选择和分配UltraScale GTH 发送和接收处理流程UltraScale…

kali linux使用Proxmark3

其实kali linux下已经集成了Proxmark3命令&#xff0c;但是由于Proxmark3是开源设备&#xff0c;有时候系统默认安装的版本并不能很好的使用&#xff0c;因此需要手动编译最新的版本。 step 1 准备Proxmark3编译环境&#xff0c;因为kali linux比较激进&#xff0c;很多老旧的…

这书看着贼得劲儿

作者呕心沥血2年&#xff0c;再出力作~~~ 给大家推荐一本好玩的书 神经网络与TensorFlow 本来以为出版了第一本书&#xff0c;应该对于漫长的审核有免疫力了&#xff0c;结果又被这本书折磨了2年。于是作者痛定思痛&#xff0c;决定第三本书写一本纯科普的书籍。 墙裂推荐 这…

电力智慧运维系统

电力智慧运维系统是以提高用户侧电力运行安全&#xff0c;降低运维成本为目标&#xff1b;采用智能化运维管理工具—“电易云”&#xff0c;帮助企业建立电力运维体系全方位的信息化、数字化平台&#xff0c;实现设备运行的数字化在线监控与线下维护处理的有机融合&#xff0c;…

没错,数据库确实应该放入 K8s 里!

昨天冯老板发了一篇文章探讨了为什么将数据库放入 K8S 中不是一个明智的选择。 如果是四年前有人质疑容器化数据库我觉得还可以 battle 一下&#xff0c;都 2023 年了还有人不能认清这个大势&#xff0c;我就有必要来谈谈我的看法了。 我从 K8s 0.9 版本时就开始做这件事&…

离线环境下安装微软Visual Studio 2022 生成工具

1. 前言 最近&#xff0c;在学习cython的时候&#xff0c;需要安装windows下的C/C编译、链接工具。开始觉得传统的msvc太大了&#xff0c;想要尝试Mingw&#xff0c;但是都是编译错误。无奈之下&#xff0c;还是要安装msvc。 微软提供了Visual Studio 2022 Build Tools &…

多线程基础

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 多线程向来是面试的重灾…

OSPF/Open Shortest Path First

OSPF&#xff08;开放最短路径优先&#xff0c;Open Shortest Path First&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在同一自治系统&#xff08;AS&#xff09;内的路由器之间交换路由信息。它是一个开放标准协议&#xff0c;设计用于支持复杂…