JDK17语法新增特性

目录

[1. yield关键字](#1. yield关键字)

[2. var关键字](#2. var关键字)

[3. 空指针异常](#3. 空指针异常)

[4. 密封类](#4. 密封类)

[5. 接口中的私有方法](#5. 接口中的私有方法)

[6. instanceof](#6. instanceof)

[7. 其他](#7. 其他)


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

选用Java17,概括起来有以下几个原因:

  1. JDK17是LTS(长期支持版)可以免费商用到2029年,且将前面几个(JDK 9-JDK 16)去其糟粕,取其精华
  2. JDK17性能提高,比如重写了底层NIO,至少提升10%
  3. 大多数第三方框架和库都已经支持

1. yield关键字

从Java13开始引入,用于从case的代码块中返回值

java 复制代码
public class Test {
    public static void main(String[] args) {
        String data = "one";
        int result = switch (data) {
            case "one" -> 1;
            case "two" -> 2;
            default -> 0;
        };
        System.out.println(result);
    }
}

如果不想使用指向符,可以使用yield来代替:

java 复制代码
public class Test {
    public static void main(String[] args) {
        String data = "two";
        int result = switch (data) {
            case "one":
                yield 1;
            case "two":
                yield 2;
            default:
                yield 0;
        };
        System.out.println(result);//2
    }
}

2. var关键字

从Java10开始引入

使用var可以使代码更简洁。有的时候类型名称会非常长,例如泛型。var像一个简化器,使我们不必反复写类型名

java 复制代码
        var name="zhangsan";
        var age=10;

注意:

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

3. 空指针异常

java 复制代码
public class Test {
    public static void main(String[] args) {
        String s = null;
        String s1 = s.toLowerCase();
        System.out.println(s1);
    }
}

4. 密封类

密封类一般应用在类和接口中,对接口和类的实现和继承进行约束。主要是用的关键字是final,一个类被final修饰,这个类就变成完全封闭的状态了,所有类都没办法继承

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

java 复制代码
sealed class Animal permits Dog {
    private String name;
    private int age;

    public void eat() {
        System.out.println("eat");
    }

}

non-sealed class Dog extends Animal {//继承的类要加上non-sealed表示不限制

    @Override
    public void eat() {
        super.eat();
    }
}

总结:

  1. sealed修饰的类必须要有子类(final修饰的密封类可以没有子类)
  2. 使用non-sealed关键字修饰。表示不限制,任何类都可以继承
  3. 未被permits允许的类型,则没办法继承(只允许permits后面的类继承),如果没有写,都允许
java 复制代码
sealed class Animal permits Dog, Cat {
    private String name;
    private int age;

    public void eat() {
        System.out.println("eat");
    }

}

sealed class Cat extends Animal permits OraCat {

}

non-sealed class OraCat extends Cat {
    
}

5. 接口中的私有方法

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

java 复制代码
interface Hello {
    public void sayHello();

    //默认方法
    default void saySomething() {
        say();
        sayHello();
    }

    //私有方法
    private void say() {
        System.out.println("Hello");
    }
}

6. instanceof

java 复制代码
        if(obj instanceof String){
            String str=(String) obj;
            ...
        }

上面的instanceof语法一共做了3件事:

  1. 判断是否为String类型
  2. 如果是,转为String类型
  3. 创建一个名为str的临时变量

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

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

        }

7. 其他

  1. ZGC-新一代垃圾回收器、G1垃圾回收器相关等等
  2. record类的使用
  3. Stream API的部分改进
  4. HttpClient重写了,支持HTTP2.0
  5. 支持List.of(),Set.of(),Map.of()和Map.ofEntries()等工厂方法实例化对象
相关推荐
ForgeAI码匠4 小时前
ForgeAdmin|Spring Boot 3 后台框架的自动配置设计:少写配置,多做组合
java·spring boot·后端
tongluowan0074 小时前
Redisson的参数及工作原理
java·redis·lua·分布式锁
小娄~~4 小时前
C语言卷子错题集
c语言·开发语言·数据结构
仙俊红4 小时前
Integer\int对比,equals()\hashcode面试
java·面试·职场和发展
WiChP4 小时前
【V0.1B10】从零开始的2D游戏引擎开发之路
java·数据库·游戏引擎
一然明月5 小时前
qt基本用法
开发语言·qt
云烟成雨TD5 小时前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
ForgeAI码匠5 小时前
Maven 多模块项目如何避免越写越乱?Forge Admin 的模块边界实践
java·人工智能·开源·maven
hef2885 小时前
Prism图形设计从入门到精通:外观设置、图层顺序与微调技巧
开发语言
z落落5 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#