一、jdk17
1.密封类 sealed class
/**
* Person.class
* jdk 17 sealed 密封类
* 可以通过permits指定能够允许继承或实现的子类,避免抽象类被滥用
* 继承密封类的子类必须用sealed、final、或者non-sealed修饰
* @author zs
* @date 2022/5/24
*/
public sealed abstract class Person permits Employee, Manager {
protected String name;
protected Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
abstract String getPersonInfo();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
/**
* 继承或实现自密封类的子类必须用sealed、final、或者non-sealed修饰
* @author zs
* @date 2022/5/24
*/
public non-sealed class Employee extends Person{
protected Integer salary;
public Employee(String name, Integer age,Integer salary) {
super(name, age);
this.salary = salary;
}
@Override
String getPersonInfo() {
return "Employee: " + name + ",age: " + age + ",salary: " + salary;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
}
public non-sealed class Manager extends Person {
protected String department;
public Manager(String name,Integer age,String department) {
super(name,age);
this.department = department;
}
@Override
String getPersonInfo() {
return "Manager: " + name + ",age: " + age + ",department: " + department;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
2.switch 模式匹配
/**
* jdk17 switch 模式匹配 当对象类型满足时直接赋值
* @param person
*/
public static void getPersonInfoSwitch(Person person){
switch (person){
case Employee e -> System.out.println(e.getPersonInfo());
case Manager m -> System.out.println(m.getPersonInfo());
default -> System.out.println("Unknown person type");
}
}
二、jdk16
1.record对象
/**
* jdk 16 record 对象
* 通过record关键字定义类,可以定义类的属性和方法,并且可以定义类的构造器
* 是一个final类,不能被继承
* 并且可以在方法中或者类中声明
* 成员变量是public的
* 并且自动实现toString()、equals()、hashCode()方法
*/
public record Phone(String name,Double price) {
public String getPhoneInfo(){
return "Phone: " + name + ",price: " + price;
}
}
三、jdk15
1.文本块
#jdk15之前的写法
String str = "SELECT column_name,column_name\n" +
"FROM table_name\n" +
"WHERE column_name operator value; ";
#jdk15的写法
String longStr = """
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;
""";
四、jdk14
1.instanceof 模式匹配
/**
* jdk14 instanceof 模式匹配 当对象类型满足时直接赋值
* @param person
*/
public static void getPersonInfoInstanceof(Person person){
if(person instanceof Employee employee){
System.out.println(employee.getPersonInfo());
}else if(person instanceof Manager manager){
System.out.println(manager.getPersonInfo());
}else{
System.out.println("Unknown person type");
}
}
五、jdk10
1.var 关键字
/**
* jdk 10 新增var 关键字,可以根据等式右边自动推导等式左边的类型
* 注意事项:
* 1.等式右边必须初始化
* 2.只能用于定义局部变量
* 3.不能用于定义成员变量、方法参数、返回类型
* 4.不能定义复合变量
*/
var employee = new Employee("zs",20,1000);
var manager = new Manager("zs",20,"IT");
六、jdk9
1.快速创建不可变集合
/**
* jdk 9 新增不可变对象的快捷创建方法
* 无法使用add、remove、set方法,并且不能存放null值
* Map.of(k1,v1,k2,v2);
* List.of(v1,v2,v3);
* Set.of(v1,v2,v3);
*/
Set<Person> personSet = Set.of(employee,manager);
Map<String,Person> personMap = Map.of(employee.getName(),employee,manager.getName(),manager);
List<Person> personList = List.of(employee,manager);