JDK17新增语法特征

1、引言

Spring Boot 3.0 开始不再支持 JDK 8,转而支持 JDK 17。
这篇博客我会列举较常用的新语法特性。

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~本次博客到这里就结束了,

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

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

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

  • 39
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值