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
密封类和接口,作用是限制一个类可以由哪些子类继承或者实现。
- 如果指定模块的话,sealed class和其子类必须在同一个模块下。如果没有指定模块,则需要在同一个包下。
- sealed class指定的子类必须直接继承该sealed class。
- sealed class的子类要用final修饰。
- 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这几个命令添加到环境变量中。这部分可以打开环境变量看下。