首页 > 其他分享 >JDK17新增语法特征

JDK17新增语法特征

时间:2024-06-23 08:58:27浏览次数:3  
标签:JDK17 子类 void 新增 Dog 语法 sealed 修饰 public

1、引言

从springboot3.0开始,已经不支持JDK8了。 从3.0开始,转变为JDK17。   选用 Java 17,概括起来主要有下面几个主要原因: 1. JDK 17 是 LTS (长期支持版),可以免费商用到 2029 年。而且将前面几个过渡版(JDK 9-JDK 16) 去其糟粕,取其精华的版本; 2. JDK 17 性能提升不少,比如重写了底层 NIO,至少提升 10% 起步; 3.大多数第三方框架和库都已经支持,不会有什么大坑;   这篇博客我会列举较常用新语法特性。  

2、新增语法特征

2.1 yield关键字

从Java13开始引⼊yield关键字,yield关键字应用于switch语句中,我们可以使用yield来简化代码。

正常的switch语句代码:

public static void main(String[] args) {
        int value = 0;
        String flg = "three";
        switch (flg) {
            case "one":
                value = 1;
                break;
            case "two":
                value = 2;
                break;
            case "three":
                value = 3;
                break;
            default:
                value = -1;
                break;
        }
        System.out.println(value);
    }

使用 -> 来简化代码:

public static void main(String[] args) {
        String flg = "three";
        int value = switch (flg) {//使用 -> 来简化代码
            case "one" -> 1;
            case "two" -> 2;
            case "three" -> 3;
            default -> -1;
        };//注意这里要加;
        System.out.println(value);
    }

也可以使用yield来简化代码:

public static void main(String[] args) {
        String flg = "three";
        int value = switch (flg) {//使用yield关键字来简化代码
            case "one" : yield 1;
            case "two" : yield 2;
            case "three" : yield 3;
            default : yield -1;
        };//注意这里要加;
        System.out.println(value);
    }

2.2 var关键字

从Java10开始引⼊var关键字,var关键字的出现也是为了简化代码。

代码示例:

public static void main(String[] args) {
        var name = "dings";//Java会自动推导出name是String类型
        var age = 18;//Java会自动推导出age是int类型
        System.out.println(name+" "+age);
    }

编译器会通过所赋的值来自动推导出变量的类型。

需要注意一下几点:

1.var不能用来声明字段(成员变量)

2.var不能用来声明方法的参数

3.var不能用来声明方法的返回值类型

4.var声明的变量必须初始化,且不能初始化为null

2.3 sealed关键字(密封类)

在SE的学习中,我们已经知道,当类被final修饰时,这个类就变成了密封类,被final修饰的密封类不能再被任何类所继承。

在JDK17中,引入了sealed关键字,当类被sealed修饰时,也称作密封类,但是可以缩小密封的范围,在类的末尾通过permits来将这个密封类的继承权限开放给一些类,使得这个密封类可以被某些特定的类所继承。

sealed class A permits B,C,D {//将密封类的继承权限开放给B,C,D
    //sealed修饰的类必须要有子类
    //且这些子类必须被final修饰或被sealed修饰或者被non-sealed修饰
}
non-sealed class B extends A {//子类可以被non-sealed修饰,表示 不限制

}
final class C extends A {//子类可以被final修饰

}
sealed class D extends A {//子类也可以被sealed修饰,这个子类也成为了密封类,这个子类也必须再有子类

}
non-sealed class E extends D {//继承被sealed修饰的D

}

重点总结:

1.被sealed修饰的密封类通过permits来将继承权限开放给一些类(可以开放给多个类),如果没有写permits,那这个密封类就可以被任何类继承。

2.被sealed修饰的密封类必须要有子类。

3.这些子类必须被final修饰或被sealed修饰或者被non-sealed修饰。

4.被non-sealed修饰,表示不限制,可以被任何类继承,也可以不继承。

5.如果写了permits,那没有被permits允许的类,不能继承于这个密封类。

6.sealed和final的区别就是,sealed修饰的密封类必须要有子类。而final修饰的密封类必须没有子类。

2.4 接口中的私有方法

Java 8, 接口可以有默认方法。Java9之后,可以在接口内实现私有方法的实现,这个私有方法不 用被实现接口的类重写。(私有方法主要用于默认方法的使用)   代码示例:
interface A1 {
    void func1();
    default void func2() {//接口的默认方法
        System.out.println(1);
        func3();
    };//(课件这里加了; 我试了一下,加不加都可以)
    private void func3() {//接口的私有方法
        System.out.println(2);
    }
}
public class Demo implements A1{
    @Override
    public void func1() {

    }
    public static void main(String[] args) {
        
    }
}

2.5 instanceof关键字

在SE学习向下转型的时候,我们就用到了instanceof关键字,是这样使用的:

class Animal {
    public void eat() {

    }
}
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗在吃饭");
    }
    public void swim() {
        System.out.println("狗在游泳");
    }
}
public class Test2 {
    public static void main(String[] args) {
        Animal animal = new Dog();
        if(animal instanceof Dog) {//判断animal引用的是否为Dog类
            Dog dog = (Dog)animal;
            dog.swim();
        }
    }
}

以前学习时,我们使用instanceof用来做三件事:

1.判断animal引用的是否为Dog类型的数据

2.如果是将animal为强转为Dog类型

3.创建一个Dog类的临时变量,将animal赋值给这个临时变量

在JDK16中,对instanceof进行了优化,使得代码更加的简洁:

public static void main(String[] args) {
        Animal animal = new Dog();
        if(animal instanceof Dog dog) {//判断animal引用的是否为Dog类,如果是创建临时变量dog
            dog.swim();
        }
    }

2.6 其他

还有很多现阶段不常用的,大家感兴趣的话,可以去探索!

 

 

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

 

标签:JDK17,子类,void,新增,Dog,语法,sealed,修饰,public
From: https://blog.csdn.net/2401_83595513/article/details/139888884

相关文章

  • vue中的模板语法
    第1部分:引言1.1介绍Vue框架Vue.js,简称Vue,是一个用于构建用户界面的渐进式JavaScript框架。自从2014年首次发布以来,Vue因其简洁、易学和高效而迅速赢得了开发者的青睐。Vue的核心库只关注视图层,易于与其他库或现有项目整合,同时也可以支持通过各种插件和库构建复杂的单页应......
  • Python语法
    Python领导:不要分号1.基礎变量定义x=100判断if循环for...in...、whilebreak、continue函数def函数名(参数):函数体类class类名:def__init__(self,p1,p2):self.param1=p1self.param2=p2类变量、实例变量__repr__......
  • 从JDK8升级到JDK17
    一、概述鉴于JDK8已经是老古董,还有性能问题,兼且各个公司已经不再维护1.8的JDK,所以升级公司的核心产品之一的后端到JDK到17是相对要紧的事情。通过升级到jdk17,具有以下好处:不要在头疼同时适应两个jdk,放下适应JDK8的负担在生产环境基本上只需要部署一个jdk即可具有更好的性能......
  • Python基础语法,非常值得新手小白学习!
    Python基础语法(一)Python的特点1. 简单Python是一种代表简单思想的语言。2. 易学Python有极其简单的语法。3. 免费、开源Python是FLOSS(自由/开放源码软件)之一。4. 高层语言使用Python编写程序时无需考虑如何管理......
  • ES6 新增Set 和 Map 两种数据结构
    ES6新增了Set和Map这两种数据结构,它们为JavaScript提供了更强大和灵活的数据处理能力。下面详细介绍一下Set和Map的特性和用法:SetSet是一种类似于数组的数据结构,但是成员的值都是唯一的,没有重复的值。特性:Set中的元素是唯一的,不会出现重复的值。Set可以接......
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(三)-shell语法
    主要通过讲解shell中的一些基本语法,可以当作日常的笔记来进行查询和记忆。文章目录前言一、shell二、shell语法1.运行方式2.注释3.变量4.默认变量 5.数组 总结前言主要通过讲解shell中的一些基本语法,可以当作日常的笔记来进行查询和记忆。提示:以下是本篇......
  • 【Shell脚本】 Shell索引数组变量:定义-获取-拼接-删除、alisa内置命令、默认输出换行
    目录 Shell索引数组变量:定义-获取-拼接-删除 数组的获取 数组的拼接数组的删除 alisa内置命令默认输出换行语法 read内置命令 declare内置命令获取指定key的值使用declare定义一普通数组,并获取打印元素数据的值 expr命令 算术运算符 布尔运算符 逻辑......
  • 聊聊语法糖
    语法糖(Syntacticsugar)是指编程语言中添加的某种语法,这种语法对语言的功能没有影响,但更方便程序员使用,并能增加程序的可读性,减少代码出错的机会。历史:语法糖这一术语是由英国计算机科学家彼得·约翰·兰达(PeterJ.Landin)发明的。在编程中,语法糖通过提供更为简洁、易读的代......
  • 若依框架页面新增时,富文本加入图片保存时出现:JSON parse error: Unexpected character
    在使用若依框架的富文本框新增时,如果插入一个图片的时候会出现一个JSONparseerror:Unexpectedcharacter('/'(code47)):maybea(non-standard)comment?(notrecognizedasonesinceFeature'ALLOW_COMMENTS'notenabledforparser);nestedexceptioniscom.fas......
  • python基础语法
    目录字面量注释变量标识符运算符字符串扩展数据输入字面量字面量:在代码中,被写出来的固定的值,称之为字面量。python中常用的有6种值(数据)的类型:注释注释:在程序代码中对程序代码进行解释说明的文字。作用:注释不是程序,不能被执行,只是对程序代码进行解释说明,让别人可......