第十五章 新特性

  • try-with-resources
// 操作资源,正常是在 finally内进行关闭流
// java7之后 try-with-resources 不需要再关闭流 只需要写在try(内)
try (FileInputStream fileInputStream = new FileInputStream("aaa.txt");) {
// java9 对 try-with-resources再次改造,可在try()外面声明
 FileInputStream fileInputStream = new FileInputStream("aaa.txt");
 try (fileInputStream) {
    byte[] bytes = new byte[1024];
    int len;
    while ((len = fileInputStream.read(bytes)) != -1) {
        System.out.println(new String(bytes, 0, len));
    }
} catch (Exception e) {
    e.printStackTrace();
}
  • switch增强:java13后可接收返回值
int month = 5;
// 正常写法
String reason = switch (month) {
    case 1:
    case 2:
    case 3:
        yield "春天";
    case 4:
    case 5:
    case 6:
        yield "夏天";
    default:
        throw new Exception("无法匹配");
};

// java12 增强写法
reason = switch (month) {
    case 1, 2, 3 -> "春天";
    case 4, 5, 6 -> "夏天";
    default -> throw new Exception("无法匹配");
};
  • java10 局部变量类型判断 不建议使用

var i = 10;

  • instanceof的模式匹配
// 以前
Animal a = new Cat();
if (a instanceof Cat) {
    Cat b = (Cat) a;
    b.eat();

}

//  java16 使用instanceof的模式匹配后
if (a instanceof Cat c) {
    c.eat();
}
  • 文本块

java12新增
在java14版本中,针对文本块又新增两个特性(阅览)。
1)在一行的结尾增加"\"可以取消改行的换行符;
2)可以通过"\s"增加空格。

String str = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>
""";
  • Record类型:java19开始,专门做纯数据载体,可以将这种类型定义为Record。

状态声明中的每个属性,都是默认采用了private和final修饰,则属性值就不可修改,本质还是class,只不过简化了编码的过程。
在Record类中,默认已经重写了0bject类提供的equals(),hashcode(),toString()方法
在Record类中,默认提供全参的构造方法,并且提供的getter方法名和属性名保持一致。
Record类采用了final修饰,并且显示的继承于java.lang.Record类,因此就不能继承别的父类。
其他使用方式和普通类一样

声明Record类
package com.lambda;

public record Users(String name, int age) {
}

使用
Users user = new Users("John", 18);
System.out.println(user.name());
System.out.println(user.age());
System.out.println(user.toString());
System.out.println(user.hashCode());
  • 密封类、密封接口 java15

定义的类只允许指定类可以继承,防止代码意外扩展

// 只允许Teacher, Student, Worker 可以继承,其他类不能继承
sealed class Person permits Teacher, Student, Worker {}

// 当一个类继承了密封类后,该类必须使用 final non-sealed sealed 这三个关键字中的一个
// sealed  密封的,后面使用permits指定限定继承类
// final 最终的
// non-sealed  非密封的

final class Teacher extends Person {}

non-sealed class Student extends Person {}

sealed class Worker extends Person permits OtherWorker {}

non-sealed class OtherWorker extends Worker {}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容