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);}
}

代码分析:

  1. 定义类和主方法:代码定义了一个名为Test的类,并包含一个main方法,这是程序的入口点。

  2. 初始化变量:声明并初始化了两个变量,dataresultdata被赋值为字符串"one",result被初始化为0。

  3. switch语句:

    • 根据data的值进行判断。

    • 如果data的值是"one",则执行result = 1;,并通过break跳出switch语句。

    • 如果data的值是"two",则执行result = 2;,并通过break跳出switch语句。

    • 如果data的值不是"one"或"two",则执行default块,将result赋值为-1,并通过break跳出switch语句。

  4. 输出结果:通过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. (1)声明一个sealed类或接口。

  2. (2)使用permits关键字明确允许哪些类可以继承该sealed类或接口。

  3. (3)被允许的子类必须是finalsealed,或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类,只有CircleRectangleSquare可以继承它。

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类型的子类的实例。它返回一个布尔值,如果objecttype类型或其子类的实例,则返回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 类的实例");}}
}

解释:

  1. Animal是一个类,DogAnimal的子类。

  2. main方法中,创建了一个Dog对象,并将其赋值给一个Animal类型的变量animal

  3. 使用instanceof关键字,首先检查animal是否是Dog类的实例,结果为true,因为animal确实是Dog类的实例。

  4. 接着检查animal是否是Animal类的实例,同样为true,因为Dog类是Animal类的子类。

  5. 最后检查animal是否是Object类的实例,结果同样为true,因为所有类在Java中最终都是继承自Object类的。

        通过上面的讲解,我相信你已经对Java中instanceof关键词有了一定的理解,那么instanceof关键词有什么用处呢?

instanceof的用途:

  • 类型检查和转换instanceof通常用于在运行时检查对象的类型,以便进行类型转换或根据对象的实际类型执行特定的操作。

  • 条件控制:可以根据对象的类型来决定执行不同的代码路径,以实现多态性和灵活的程序逻辑。

  • 安全性检查:在某些情况下,使用instanceof可以帮助避免类型转换异常(ClassCastException),在进行类型转换之前先检查对象的类型是否符合预期。

这样我们就大致的了解了Java中的instanceof关键词了。


以上就是本篇文章的全部内容了~~~

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

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

相关文章

相机光学(三十)——N5-N7-N8中性灰

GTI可提供N5/N7/N8中性灰涂料&#xff0c;用于不同的看色环境&#xff0c;N5/N7/N8代表深中浅不同的灰色程度&#xff0c;在成像、工业、印刷行业中&#xff0c;分别对周围观察环境有一定的要求&#xff0c;也出台了相应的标准文件&#xff0c;客户可以根据实际使用环境进行选择…

QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成

目录 引出qt中的注释和多行注释方法的注释生成 总结日积月累&#xff0c;开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用&与不使用&qt方法的参数中使用&与不使用&除法的一个坑 项目创建相关新建…

交通气象站:保障道路安全的智慧之眼

随着社会的快速发展&#xff0c;交通运输日益繁忙&#xff0c;道路安全成为公众关注的焦点。在这个背景下&#xff0c;交通气象站作为保障道路安全的重要设施&#xff0c;正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息&#xff0c;也为广大驾驶员…

高阶面试-dubbo的学习

SPI机制 SPI&#xff0c;service provider interface&#xff0c;服务发现机制&#xff0c;其实就是把接口实现类的全限定名配置在文件里面&#xff0c;然后通过加载器ServiceLoader去读取配置加载实现类&#xff0c;比如说数据库驱动&#xff0c;我们把mysql的jar包放到项目的…

arm环境安装达梦数据库

作者&#xff1a;振鹭 一、安装前准备 1、创建用户和用户组 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba2、修改文件打开最大数 vi /etc/security/limits.conf #文件末尾添加以下四行 dmdba hard nofile 65536 dmdba soft nofile 65536 d…

Kafka安装使用指南

Kafka是一种高吞吐量的分布式发布订阅消息系统。 Kafka启动方式有Zookeeper和Kraft&#xff0c;两种方式只能选择其中一种启动&#xff0c;不能同时使用。 【Kafka安装】 Kafka下载 https://downloads.apache.org/kafka/3.7.1/kafka_2.13-3.7.1.tgz Kafka解压 tar -xzf kafka_…

神经网络设计过程

1.可根据Iris特征直接判断 2.神经网络方法&#xff0c;采集大量的Iris特征&#xff0c;分类对应标签&#xff0c;构成数据集。 将数据集喂入搭好的神经网络结构&#xff0c;网络通过反向传播优化参数得到模型。 有新的网络送入到模型里&#xff0c;模型会给出识别结果。 3.…

SaaS知识库新选择: 值得学习的七大SaaS知识库实例

|概述 在当前的SaaS&#xff08;Software as a Service&#xff09;行业中&#xff0c;公司面临着前所未有的机遇与挑战并存的现状。随着云计算和人工智能技术的飞速发展&#xff0c;SaaS模式已成为企业信息化转型的优选路径&#xff0c;为企业提供了高效、灵活且成本效益显著…

python(3.7版本)安装mitmproxy

环境介绍:win11, python3.7 pip install mitmproxy5.0.0 命令行cmd下,输入 Mitmdump 查看结果是否报错 如果报错上面这样子,就是markupsafe版本问题 换个Markupsafe版本就可以了 成功了吧!!!,如有问题,欢迎留言

【深度学习基础】MAC pycharm 专业版安装与激活

文章目录 一、pycharm专业版安装二、激活 一、pycharm专业版安装 PyCharm是一款专为Python开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在帮助用户在使用Python语言开发时提高效率。以下是对PyCharm软件的详细介绍&#xff0c;包括其作用和主要功能&…

高品质标准化诊断肝素诱导性血小板减少症试剂盒—HIT AlertTM Kit

肝素诱导的血小板减少症是一种免疫机制介导的综合征&#xff0c;实验室通常进行免疫学和功能学检测来诊断。免疫学通过检测PF4/肝素抗体来诊断&#xff0c;不考虑其激活血小板能力&#xff0c;比如ELISA&#xff0c;化学发光免疫等检测手段。功能学检测引起肝素依赖性血小板活化…

学习笔记——动态路由——OSPF链路状态通告(LSA)

十、OSPF链路状态通告(LSA) 1、链路状态通告简介 (1)LAS概述 链路状态通告(Link State Advertisement&#xff0c;LSA)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位&#xff0c;LSDB由一条条LSA构成的。是OSPF中计算路由的重要依据。 LSA用于向其它邻接OSPF路…

Web3知识图谱,一篇读完

这张图展示了区块链生态系统的架构和主要组件。以下是对图中内容的概括总结&#xff1a; 基础层&#xff1a; 底层基础设施&#xff1a;包括光纤网络、P2P网络、非对称加密、哈希算法、默克尔树和随机数生成。共识机制&#xff1a; PoW&#xff08;工作量证明&#xff09;: 比特…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0&#xff0c;然后 gym 版本是 0.22.0&#xff0c;python 版本是 3.8 &#xff0c;pygame 版本是 2.6.0 。 首先安装一下 gym&#xff1a; pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

AI究竟是在帮助开发者还是取代他们?来看大佬的观点你就明白了

AI&#xff08;人工智能&#xff09;在现代社会中扮演着越来越重要的角色&#xff0c;其在软件开发领域的应用也日益广泛。关于AI是在帮助开发者还是取代他们&#xff0c;V 哥个人认为&#xff0c;一半一半吧&#xff0c;为什么这么说&#xff0c;先不用噴&#xff0c;我们需要…

YOLOv8改进 | 注意力机制 | 增强模型在图像分类和目标检测BAM注意力【小白必备 + 附完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

安防管理平台LntonCVS视频汇聚融合云平台智慧火电厂安全生产管理应用方案

中国的电力产业作为国民经济发展的重要能源支柱&#xff0c;被视为国民经济的基础产业之一。目前&#xff0c;我国主要依赖火力发电&#xff0c;主要燃料包括煤炭、石油和天然气等&#xff0c;通过燃烧转化为动能&#xff0c;再转变为电能输送至全国各地。火力发电量占全国发电…

【软件测试】 1+X初级 功能测试试题

【软件测试】 1X初级 功能测试试题 普通员工登录系统&#xff0c;在“个人信息维护”模块&#xff0c;可以查看和维护个人信息。个人信息维护需求包括用户&#xff08;UI&#xff09;页面、业务规则两部分。 UI 界面 个人信息维护 修改基本信息 业务规则 1. 个人信息维护页面…

CB-LLM 可信大模型,让大模型可解释

CB-LLM 可信大模型&#xff0c;让大模型可解释 提出背景解法拆解目的问题框架图第1步&#xff1a;概念生成第2步&#xff1a;自动概念评分&#xff08;ACS&#xff09;第3步&#xff1a;训练概念瓶颈层&#xff08;CBL&#xff09;第4步&#xff1a;学习预测器 例子&#xff1a…

图片批量重命名bat,一个脚本快速搞定图片批量重命名

BAT 批处理 是一种在 Microsoft Windows 操作系统中使用的脚本语言&#xff0c;用于自动执行一系列预定义的命令或任务。这些命令集合通常存储在一个文本文件中&#xff0c;文件扩展名为 .bat 或 .cmd。批处理脚本可以包含简单的命令&#xff0c;如文件复制、移动、删除&#x…