跳至主要內容

Java 14~15新特性


java 14新特性

java 14 新增了很多特性,这里针对较为突出的特性进行说明。jdk12和jdk13中预览版的switch特性,在jdk14中已经是正式的语法了。

instanceof模式匹配

该特性可以减少强制类型转换的操作,简化了代码,代码示例:

public class TestInstanceof{
    public static void main(String[] args){
    
        //jdk14之前的写法
        Object obj = new Integer(1);
        if(obj instanceof Integer){
            Integer i = (Integer)obj;
            int result = i + 10;
            System.out.println(i);
        }

        //jdk14新特性  不用再强制转换了
        //这里相当于是将obj强制为Integer之后赋值给i了
        if(obj instanceof Integer i){
            // 也就是可以直接用i了,省略了一步
            int result = i + 10;
            System.out.println(i);
        }else{
            //作用域问题,这里是无法访问i的
        }
    }
}

这个是预览版的功能所以需要使用下面命令编译和运行

编译:
    javac --enable-preview -source 14 TestInstanceof.java

运行:
    java --enable-preview TestInstanceof

友好的空指针(NullPointerException)提示

jdk14中添加了对于空指针异常友好的提示,便于开发者快速定位空指针的对象。示例代码:

class Machine{
    public void start(){
        System.out.println("启动");
    }
}

class Engine{
    public Machine machine;
}

class Car{
    public Engine engine;
    
}

public class TestNull{
    public static void main(String[] args){
        //这里会报出空指针,但是哪个对象是null呢?
        new Car().engine.machine.start();
    }
}

在运行上面代码的时候,错误信息就可以明确的指出那个对象为null了。此外,还可以使用下面参数来查看:

java -XX:+ShowCodeDetailsInExceptionMessages TestNull

这样编译器会明确的告诉开发者哪个对象是null。

record类型

之前在编写Java Bean类的时候,需要编写成员变量,get方法,构造方法,toString方法,hashcode方法,equals方法。这些方法通常会通过开发工具来生成,在jdk14中新增了record类型,通过该类型可以省去这些代码的编写。

jdk14编写User类:

public record User(String name,Integer age){}

通过反编译命令可以看到该字节码文件中的内容,User类是继承了Record类型:

javap -p -private user

编写测试类:

public class TestUser{
    public static void main(String[] args){
        User u = new User("jack",15);
        System.out.println(u);
        System.out.println(u.name());
    }
}

这个是预览版的功能所以需要使用下面命令编译和运行

编译:
javac --enable-preview -source 14 TestUser.java

运行:
java --enable-preview TestUser

记录类型有自动生成的成员,包括:

  • 状态描述中的每个组件都有对应的private final字段。

  • 状态描述中的每个组件都有对应的public访问方法。方法的名称与组件名称相同。

  • 一个包含全部组件的公开构造器,用来初始化对应组件。

  • 实现了equals()和hashCode()方法。equals()要求全部组件都必须相等。

  • 实现了toString(),输出全部组件的信息。

Java 15新特性

Sealed Classes

密封类和接口,作用是限制一个类可以由哪些子类继承或者实现。

  1. 如果指定模块的话,sealed class和其子类必须在同一个模块下。如果没有指定模块,则需要在同一个包下。
  2. sealed class指定的子类必须直接继承该sealed class。
  3. sealed class的子类要用final修饰。
  4. sealed class的子类如果不想用final修饰的话,可以将子类声明为sealed class。

Animal类,在指定允许继承的子类时可以使用全限定名

// 只允许Cat和Dog继承
public sealed class Animal permits Cat, Dog{ // 多个子类之间用,隔开。
        public void eat(){}
}

Cat类

// 由于Animal只能由Cat和Dog继承,因此Cat就不能有子类了,因此Cat类需要被修饰为final
public final class Cat extends Animal{ 
    public void eat(){
        System.out.println("123");
    }
}

Dog类

// Dog类可以有子类,那么就将Dog也修饰为sealed
public sealed class Dog extends Animal
    permits Husky {}

Husky类

public final class Husky extends Dog{
}

Test类

public class Test{
    public static void main(String[] args){
        Cat c = new Cat();
        c.eat();
        Dog d = new Dog();
    }
}

CharSequence新增的方法

该接口中新增了default方法isEmpty(),作用是判断CharSequence是否为空。

TreeMap新增方法

  • putIfAbsent

  • computeIfAbsent

  • computeIfPresent

  • compute

  • merge

文本块

文本块由预览版变为正式版

无需配置环境变量

win系统中安装完成之后会自动将java.exe, javaw.exe, javac.exe, jshell.exe这几个命令添加到环境变量中。这部分可以打开环境变量看下。

seven97官方微信公众号
seven97官方微信公众号