目录
一、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 nullat 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_01: invokespecial #1 // Method java/lang/Record."<init>":()V4: aload_05: aload_16: putfield #7 // Field name:Ljava/lang/String;9: aload_010: aload_211: putfield #13 // Field age:Ljava/lang/Integer;14: returnpublic void study();Code:0: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc #23 // String study5: invokevirtual #25 // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnpublic final java.lang.String toString();Code:0: aload_01: invokedynamic #31, 0 // InvokeDynamic #0:toString:(Lcom/lwz/java14/User;)Ljava/lang/String;6: areturnpublic final int hashCode();Code:0: aload_01: invokedynamic #35, 0 // InvokeDynamic #0:hashCode:(Lcom/lwz/java14/User;)I6: ireturnpublic final boolean equals(java.lang.Object);Code:0: aload_01: aload_12: invokedynamic #39, 0 // InvokeDynamic #0:equals:(Lcom/lwz/java14/User;Ljava/lang/Object;)Z7: ireturnpublic java.lang.String name();Code:0: aload_01: getfield #7 // Field name:Ljava/lang/String;4: areturnpublic java.lang.Integer age();Code:0: aload_01: 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{@Overridepublic void eat() {System.out.println("吃鱼");}
}
package com.lwz.java15;//需要指定子类
public sealed class Dog extends Animal permits Hushy{@Overridepublic 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新增方法
@CallerSensitivepublic 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新特性
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!