北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

爽呀,JDK17里面可以使用的神仙语法(三)

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

今天又整理了一些 JDK17里面能用的语法糖,关于继承关系以及方法扩展。

02 神仙语法

2.1 密封类关键词

关于继承关系安全性的一类语法,旨在细粒度的控制类的继承关系。该语法来自 JDK15。

先回顾一下历史,我们都知道 Java 的三大特点,封装、继承和多态。只要一个类没有被 final 关键词修饰,就可以被继承。

public final class Plane {
 #技术分享
}

如果继承后就会编译不通过,如图:

JDK17中 final 关键词依然可以使用,只是额外增加了 sealedpermitsnon-sealed 关键字。

  • sealed 声明类不可以被继承,不能单独使用,需要指定可以被继承的类,通过 permits 指定。
  • permits 声明不可继承的类,允许的类。
  • non-sealed 声明此类可以被任何类继承。继承了被 sealedpermits 修饰的类后,必须使用该关键词或 final 关键字显示声明当前类是否允许被继承。
public sealed class Animal permits Cat, Dog {
    public void eat() {}
}

public final class Cat extends Animal { @Override public void eat() { System.out.println("猫咪吃猫粮"); } }

public non-sealed class Dog extends Animal{ @Override public void eat() { System.out.println("狗狗吃狗粮"); } }

2.2 密封接口关键词

因为接口可以相互继承,所以也适用于接口的继承。在 JDK17里面,实现类和接口之间也可以指定密封接口的实现关系。因为关键字相同,这里就不在赘述,直接看案例。

public sealed interface Fly permits  Bird, Plane {
    void fly();
}

public non-sealed class Bird implements Fly{ @Override public void fly() { System.out.println("小鸟飞行"); } }

public final class Plane implements Fly { @Override public void fly() { System.out.println("飞机飞行"); } }

2.3 接口的中的私有方法

我们都知道 JDK8中增加接口 default 关键字可以编写方法,在 JDK9中可以编写 private 关键字的私有方法。因为方法私有不能被外部方法调用,只能通过接口的默认方法调用。所以 detaultprivate 关键字就可以搭配使用了。

public sealed interface Fly permits  Bird, Plane {

    private void test() {
        System.out.println("test 执行了");
    }

default void test2() { test(); }

void fly(); }

public final class Plane implements Fly {

@Override public void fly() { System.out.println("飞机飞行"); }

@Override public void test2() { Fly.super.test2(); } }

Fly plane = new Plane(); plane.test2();

2.4 String 方法增强

String.strip()String.isBlank()String.isEmptyString.lines()String.repeat() 等方法。

String str = """
            hello world
            hello world hello world
            hello world
            """;

str.lines().forEach(System.out::println);

System.out.println(str.isBlank()); System.out.println(str.isEmpty());

System.out.println(str.repeat(2));

Character c = '\u2000'; String str1 = c + "abc" + c;

System.out.println(str1.trim());

System.out.println(str1.strip());

2.5 Stream接口新增toList()

之前 Stream 转换为 List 都需要使用 Collectors.toList(),现在不需要了,该方法来自 JDK17。

List<Integer> list = Stream.of(1, 2, 5, 6, 7, 8, 9, 10).collect(Collectors.toList());

List<Integer> list = Stream.of(1, 2, 5, 6, 7, 8, 9, 10).toList();

03 小结

我们可以看到 JDK 的发展一直在拥抱变化,吸收其他语言比较好的语法加入到 JDK 中、如 sacla、python、js 等语言。更加细粒度的控制使用的类,增加安全性。

只不过更新了这么多东西,使用者能不能记住呢?太难了,学习不能停,继续学!!!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言