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

新增的JDK17语法特性

时间:2024-06-13 10:33:40浏览次数:25  
标签:String JDK17 void 特性 eat 语法 sealed var public

一、引入

从springboot3.0开始,已经不支持JDK8了,从3.0开始,转变为JDK17

了解详情点击官方博客链接:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IVhttps://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IVhttps://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-nowavailable?spm=a2c6h.12873639.article-detail.24.766d46b40LM1IV

二、yield关键字 

yield 关键字,从Java13开始引入

yield 关键字用于从case的代码块中返回值

普通的 switch 语句:

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

简化版的 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) ;
}

使用 yield 后的 switch :

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

三、var关键字 

从Java10开始,var 关键字被引入

public static void main(String[] args) {

    var name = "zhangsan";
    var age = 10;
}
// 在这段代码中,编译器会⾃动推断出name是⼀个String类型,age是⼀个int类型

使用var可以使代码更简洁

有时候,类型名称可能会非常长,例如泛型

var就像是一个简化器,让你不必反复写出繁琐的类型名 

示例:

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

}

 注意:

        1. 不能使用var来声明字段 

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

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

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

示例:

class OrgCat {
    public var name;        // error

    public var eat(var str) {        // error

    }

}
public static void main(String[] args) {
    var complexMap2 = 10;
    System.out.println(complexMap2);

    var str = null;        // error
}

四、空指针异常 

出现异常的具体方法和原因都是一目了然

如果你的一行代码中有多个方法、多个变量,可以快速定位问题所在

如果是 JDK1.8,有些情况下真的不太容易看出来

JDK8:

JDK17:

五、密封类 

密封类一般应用在类和接口中,对接口和类的实现和继承进行约束,主要使用的关键字是 final

当这个类被 final 修饰了,被修饰的类就变成完全封闭的状态了,所有类都没办法继承

JDK17提供了一个新的关键字: sealed  密封类除了可以被该关键字修饰,并且在声明末尾使用 permits 表示要开放给哪些类型

示例:

// Animal 为密封类,然后使⽤ permits 关键字,把继承权限开放给了 Dog 类
sealed class Animal permits Dog{
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
//继承的类也要加上密封限制 non-sealed 表示不限制 
non-sealed class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println(this.name+ "正在吃狗粮....");
    }
}

注意: 

        1. sealed 修饰的类必须要有子类

sealed class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
sealed class Dog extends Animal{        
    @Override       // Sealed class must have subclasses,此时Dog 被 sealed 修饰,那么Dog 必须要有⼦类!!
    public void eat() {
        System.out.println(this.name+ "正在吃狗粮....");
    }
}

        2. 使用 non-sealed 关键字修饰,表示不限制,任何类都可以继承 

sealed class Animal {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
non-sealed class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println(this.name + "正在吃狗粮....");
    }
}

        3. 未被 permits 允许的类型,则没办法继承  

sealed class Animal permits Dog {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
non-sealed class PetDog extends Animal {
    
}

正确的做法:

sealed class Animal permits Dog,PetDog {
    public String name;
    public int age;
    public void eat() {
        System.out.println("eat()....");
    }
}
non-sealed class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println(this.name+ "正在吃狗粮....");
    }
}
non-sealed class PetDog extends Animal {
}

六、接口中的私有方法

Java8,接口可以有默认方法

Java9之后,可以在接口内实现私有方法

示例:

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

七、instanceof 

示例:

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

上面的instancof语法做了三件事:

        1. 判断是否为 String 类型 

        2. 如果是,转成 String 类型

        3. 创建⼀个名为 str 的临时变量

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

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

}

标签:String,JDK17,void,特性,eat,语法,sealed,var,public
From: https://blog.csdn.net/Pritar/article/details/139466265

相关文章

  • vue3探索——在setup script中使用tsx语法
    vue3+ts+eslint配置tsxvite.config.ts安装@vitejs/plugin-vue-jsx#npmnpmi@vitejs/plugin-vue-jsx-D#yarnyarnadd@vitejs/plugin-vue-jsx-D#pnpmpnpmadd@vitejs/plugin-vue-jsx-D在vite.config.ts中使用……importvueJsxfrom'@vitejs/plugin-vue......
  • 【保姆级详细介绍JavaScript初识及基本语法】
    ......
  • C++ 新特性 | C++ 11 | typename关键字
    文章目录一、typename关键字前言:在C++的模板编程中,typename关键字扮演着至关重要的角色。它主要用于指示编译器将一个特定的标识符解释为类型名称,而不是变量名或其他实体。本文将深入探讨typename的用法,帮助读者更好地理解其在模板编程中的作用。一、typename关......
  • JDK8新特性之Lambda表达式
    Lambda,音标[ˈlamdə],中文翻译“拉姆达”,第11个希腊字母λ(大写Λ)。1.引入原因JDK8引入Lambda表达式是为了简化匿名类相关代码。当接口比较简单,只有一个方法时,我们也不得不写许多无关业务的代码来实现匿名类。而Lambda表达式却允许将功能(functionality)视作方法参数或者视代......
  • Python 详述 Python 中的 property 语法
    在大多数语言的程序中,一个类,每有一个属性,就会对应setter和getter,基本都是标配。示例:classMoney(object):def__init__(self):self.__money=0defgetMoney(self):returnself.__moneydefsetMoney(self,value):ifisinsta......
  • 【CMake系列】08-debug release特性设置
    在构建的程序版本中,一共有debugreleaseminisizerelwithDebugInfo四种,其中我们主要使用到就是debugrelease两种,这两种存在着一定的不同,debug版本用于调试,有调试信息,方便调试,体积也更大;release版本用于发布,体积更小;在使用cmake针对debugrelease配置时也存在一定的不......
  • 利用抽象语法树还原Uglify打包的js混淆代码
    Uglify是一个用于JavaScript代码压缩和混淆的工具,旨在减小文件体积和加密代码,提高网页性能和保护代码安全性.本文讲一下使用AST(抽象语法树)对Uglify压缩的JS代码还原相关的操作。本文只大概讲还原算法供学习使用,不保证完全当工具使用。后面使用的代码我会提供部分关键java......
  • Vue3——setup语法糖
    setup概述setup是Vue3中新的配置项,值是一个函数,组件中所用到的数据、方法、计算属性、监视等等,均配置在setup中。setup函数返回的对象中的内容,可直接在模版中使用。setup中不能使用this关键字,this是undefined。setup会在beforeCreate()函数之前调用,领先所有的钩子函数执行的......
  • MySQL之高级特性(一)
    高级特性外键约束InnoDB是目前MySQL中唯一支持外键的内置存储引擎,所以如果需要外键支持那选择就不多了。使用外键是有成本的。比如外键通常都要求每次在修改数据时都要在另一张表中多执行一次查找操作。虽然InnoDB强制外键使用索引,但还是无法消除这种约束检查的开销。如果......
  • JavaScript基础语法
    原文链接:https://blog.csdn.net/m0_67683346/article/details/1275910796.2、console.log在控制台打印一个日志(一般是给程序员看的):console.log("helloJavaScript");需要在开发者工具中的控制台查看打印结果:  ★console是JS中的一个“对象”,.表示取对象中的某个属性或......