目录

一、Java14新特性

1、instanceof模式匹配

2、友好的空指针(NullPointerException)提示

3、record类型

二、Java15新特性

1、Sealed Classes

2、CharSequence新增方法

3、TreeMap新增方法

4、文本块

5、无需配置环境变量

三、Java16新特性

1、包装类构造方法的警告

2、新增日时段

3、InvocationHandler新增方法


一、Java14新特性

JDK12和JDK13中预览版的switch特性,在JDK14已经是正式的语法了。

1、instanceof模式匹配

instanceof模式匹配:该特性可以减少强制类型转换的操作,简化了代码。

public class InstanceOf {
    public static void main(String[] args) {
        Object obj=1;
        if (obj instanceof Integer){
            Integer i = (Integer) obj;
            System.out.println(i);
        }

        //新写法
        if(obj instanceof Integer i){
            System.out.println(i);
        }
    }
}

2、友好的空指针(NullPointerException)提示

JDK14添加了对于空指针异常友好的提示,便于开发者快速定位空指针的对象。

package com.lwz.java14;

public class TestNull {
    public static void main(String[] args) {
        new Car().engine.machine.start();
    }
}

class Car{
    public Engine engine;
}
class Engine{
    public  Machine machine;
}
class Machine{
    public void start(){
        System.out.println("start");
    }
}

运行结果:

Exception in thread "main" java.lang.NullPointerException: Cannot read field "machine" because "engine" is null
	at com.lwz.java14.TestNull.main(TestNull.java:5)

3、record类型

record类型,通过该类型可以省去成员变量,构造方法,get、set、toString方法,hashcode方法,equals方法等代码编写

package com.lwz.java14;

public record User(String name,Integer age) {
    public void study(){
        System.out.println("study");
    }
}

测试:

package com.lwz.java14;

public class TestRecord {
    public static void main(String[] args) {
        User user = new User("小米", 18);
        System.out.println(user);//User[name=小米, age=18]
        System.out.println(user.name());//小米
        user.study();//study
    }
}

反编译

D:\xxxx....xxxx>javap -c User.class
Compiled from "User.java"
public final class com.lwz.java14.User extends java.lang.Record {
  public com.lwz.java14.User(java.lang.String, java.lang.Integer);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Record."<init>":()V
       4: aload_0
       5: aload_1
       6: putfield      #7                  // Field name:Ljava/lang/String;
       9: aload_0
      10: aload_2
      11: putfield      #13                 // Field age:Ljava/lang/Integer;
      14: return

  public void study();
    Code:
       0: getstatic     #17                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #23                 // String study
       5: invokevirtual #25                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

  public final java.lang.String toString();
    Code:
       0: aload_0
       1: invokedynamic #31,  0             // InvokeDynamic #0:toString:(Lcom/lwz/java14/User;)Ljava/lang/String;
       6: areturn

  public final int hashCode();
    Code:
       0: aload_0
       1: invokedynamic #35,  0             // InvokeDynamic #0:hashCode:(Lcom/lwz/java14/User;)I
       6: ireturn

  public final boolean equals(java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: invokedynamic #39,  0             // InvokeDynamic #0:equals:(Lcom/lwz/java14/User;Ljava/lang/Object;)Z
       7: ireturn

  public java.lang.String name();
    Code:
       0: aload_0
       1: getfield      #7                  // Field name:Ljava/lang/String;
       4: areturn

  public java.lang.Integer age();
    Code:
       0: aload_0
       1: getfield      #13                 // Field age:Ljava/lang/Integer;
       4: areturn
}

二、Java15新特性

1、Sealed Classes

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

1、如果指定模块的话,sealed class和其子类必须在同一个模块下,如果没有指定模块,则需要在同一个包下。

2、sealed class指定的子类必须直接继承该sealed class。

3、sealed class的子类要用final修饰。

4、sealed class的子类如果不想用final修饰的话,可以将子类声明为sealed class。

package com.lwz.java15;

//只希望Cat和Dog能够继承Animal类
public sealed class Animal permits Cat,Dog{
    public void eat(){

    }
}
package com.lwz.java15;

//Cat不能有子类
public final class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("吃鱼");
    }
}
package com.lwz.java15;

//需要指定子类
public sealed class Dog extends Animal permits Hushy{
    @Override
    public void eat() {
        System.out.println("吃肉");
    }
}
package com.lwz.java15;

public final class Hushy extends Dog{
}

2、CharSequence新增方法

该接口新增了isEmpty(),作用是判断CharSequence是否为空

    /**
     * Returns {@code true} if this character sequence is empty.
     *
     * @implSpec
     * The default implementation returns the result of calling {@code length() == 0}.
     *
     * @return {@code true} if {@link #length()} is {@code 0}, otherwise
     * {@code false}
     *
     * @since 15
     */
    default boolean isEmpty() {
        return this.length() == 0;
    }

3、TreeMap新增方法

putIfAbsent
computeIfAbsent
computeIfPresent
compute
merge

4、文本块

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

5、无需配置环境变量

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

三、Java16新特性

1、包装类构造方法的警告

使用包装类的构造方法在编译的时候会出现警告,不建议再使用包装类的构造方法,下面代码在javac编译之后会出现警告

public class Test {
    public static void main(String[] args) {
        Integer i=new Integer(6);
        System.out.println(i);
        synchronized (i){//警告,Integer 因有缓存池,不相关代码也可能互相影响
            
        }
    }
}
    @Deprecated(since="9", forRemoval = true)
    public Integer(int value) {
        this.value = value;
    }

2、新增日时段

打印上午下午晚上等时间

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Data01 {
    public static void main(String[] args) {
        System.out.println(DateTimeFormatter.ofPattern("B").format(LocalDateTime.now()));
    }
}

3、InvocationHandler新增方法

    @CallerSensitive
    public static Object invokeDefault(Object proxy, Method method, Object... args)
            throws Throwable {
        Objects.requireNonNull(proxy);
        Objects.requireNonNull(method);
        return Proxy.invokeDefault(proxy, method, args, Reflection.getCallerClass());
    }

Java11-13新特性

一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

10-31 00:31