目录
一、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());
}