数据结构(JAVA)JDK17语法新增特性

目录

  • yield关键字
  • var关键字
  • 空指针异常
  • 密封类
  • 接口中的私有方法
  • instanceof
  • 其他

  • yield关键字

    yield关键字用于case的代码块中返回值。
    正常switch语句

        public static void main(String[] args) {
            int result = 0;
            String str = "a";
            switch (str) {
                case "a" :
                    result = 65;
                    break;
                case "b" :
                    result = 66;
                    break;
                case "c" :
                    result = 67;
                    break;
                default:
                    result = -1;
            }
            System.out.println(result);
        }
    

    简化的switch语句

        public static void main(String[] args) {
            String str = "a";
            int result = switch (str) {
                case "a" -> 65;
                case "b" -> 66;
                case "c" -> 67;
                default -> -1;
            };
            System.out.println(result);
        }
    

    yield关键字版本

        public static void main(String[] args) {
            String str = "a";
            int result = switch (str) {
                case "a" : yield 65;
                case "b" : yield 66;
                case "c" : yield 67;
                default  : yield -1;
            };
            System.out.println(result);
        }
    

    var关键字

    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。

    空指针异常

    JDK8;报空指针异常不会解释原因。

    JDK17;报空指针异常会解释原因。

    密封类

    在之前的学习中,我们了解到一个类不想被继承,需要在类之前加final关键字。
    在JDK17中提供了⼀个新的关键字: sealed .密封类除了可以被该关键字修饰,并且在声明末尾用
    permits 表⽰要开放给哪些类型。
    例如,Class为密封类,然后使用 permits 关键字,把继承权限开放给了Student类。

    sealed class Class permits Student{
        public String class_id;
        public Class (String class_id){
            this.class_id = class_id;
        }
    }
    //继承的类也要加上密封限制 non-sealed 表⽰不限制
    non-sealed class Student extends Class{
        public String name;
        public String student_id;
    
        public Student(String class_id,String name, String student_id) {
            super(class_id);
            this.name = name;
            this.student_id = student_id;
        }
    }
    

    总结

    1. sealed修饰的类必须要有⼦类。
    2. 使⽤non-sealed关键字修饰。表⽰不限制,任何类都可以继承。
    3. 未被 permits 允许的类型,则没办法继承。

    接口中的私有方法

    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 优化后的效果。
    if (obj instanceof String str) {// obj是否为String类型,如果是创建临时变量str}
    

    其他

    还有很多方法,但对我们初学者不常有,等以后自行探索。

    作者:A旧城以西

    物联沃分享整理
    物联沃-IOTWORD物联网 » 数据结构(JAVA)JDK17语法新增特性

    发表回复