【JavaSE】JDK17的一些特性

慈云数据 6个月前 (05-13) 技术支持 42 0

前言

从springboot3.0开始,已经不⽀持JDK8了

选⽤Java17,概括起来主要有下⾯⼏个主要原因

  • JDK17是LTS(⻓期⽀持版),可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版(JDK9-JDK16) 去其糟粕,取其精华的版本
  • JDK17性能提升不少,⽐如重写了底层NIO,⾄少提升10%起步;
  • ⼤多数第三⽅框架和库都已经⽀持,不会有什么⼤坑;

    欢迎关注个人主页:逸狼


    创造不易,可以点点赞吗~

    如有错误,欢迎指出~



    目录

    前言

    yield关键字

    密封类

    接口中的私有方法

    instanceof


    yield关键字

    yield关键字,从Java13开始引⼊。yield关键字⽤于从case的代码块中返回值。

     简化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关键字代替->

    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被引⼊

    用于自动推导代码的类型,例如下面代码,编译器会⾃动推断出name是⼀个String类型,age是⼀个int类型。

        public static void main(String[] args) {
            var name ="zhangsan";
            var age =10;
        }

    使⽤var可以使代码更简洁。有时候,类型名称可能会⾮常⻓,例如泛型。var就像是⼀个简化器,让 你不必反复写出繁琐的类型名。

    例如下面代码中var根据后面的HashMap()自动推导类型 ,即这里的var代表Map 类型

    public static void main(String[] args) {
     Map complexMap = new HashMap();
     
     var complexMap2 = new HashMap();
     
    }
    

    注意:

    • 不能使⽤var来声明字段
    • 不能使⽤var来声明⽅法参数
    • 不能使⽤var来声明⽅法返回类型
    • var声明变量必须初始化,但是不能初始化为null

      密封类

      用fianl修饰的类不能被继承。

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

      //这里的sealed表示密封类,与fianl不同的是,它可以使用permits开放给一些类继承
      sealed class Person permits YL{
      }
      //继承的类也要加上密封限制 non-sealed 表⽰不限制
      non-sealed class YL extends Person{
      }

      注意:

      sealed修饰的类必须要有⼦类

      使⽤ non-sealed 关键字修饰。表⽰不限制,任何类都可以继承。

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

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

      接口中的私有方法

      Java8,接⼝可以有默认⽅法。Java9之后,可以在接⼝内实现私有⽅法实现。

      interface Hello{
          //默认方法
          default void saySomething(){
              
          }
          //私有方法
          private void sayEngHello(){
              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 
       
      }
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon