Java17新特性
Java17 新特性(面试笔记)
目录
- 1. 密封类 Sealed Classes
- 2. Record 记录类
- 3. instanceof 模式匹配
- 4. 文本块 Text Blocks
- 5. 强封装 Strong Encapsulation
- 面试对比:Record vs Lombok
1. 密封类 Sealed Classes
面试一句话:密封类用来精确控制哪些类可以继承当前类,填补
final(完全禁止继承)和普通类(任意都能继承)中间的空白。
核心概念
- 使用
sealed修饰类/接口,搭配permits指定允许继承的子类 - 被允许的子类,只能三选一:
final:不能再被继承(终止继承链)sealed:继续密封,继续限制它自己的子类non-sealed:解除密封,允许任意类继承
代码示例 - 密封类
// 密封父类:只允许 Circle、Rectangle 继承
public sealed class Shape permits Circle, Rectangle {
}
// final:不能再被继承
public final class Circle extends Shape {
}
// non-sealed:放开继承,任何人都可以继承它
public non-sealed class Rectangle extends Shape {
}
Record vs Lombok
| 特性 | Record (JDK 原生) | Lombok |
|---|---|---|
| 只读数据载体 | ✅ | ✅(@Value) |
| setter | ❌ 无,属性 final | ✅ |
| 无参构造 | ❌ 默认没有 | ✅ @NoArgsConstructor |
| Builder | ❌ 不支持 | ✅ @Builder |
| 日志注解 @Slf4j | ❌ 不支持 | ✅ |
| @SneakyThrows、@Cleanup | ❌ 不支持 | ✅ |
总结:Record 只能部分替代 Lombok;业务实体、需要 setter / 无参构造的场景,Lombok 依旧不可替代。
2. Record 记录类
面试一句话:Record是JDK原生只读不可变数据载体,一行代码自动生成全参构造、访问方法、equals、hashCode、toString。只能部分替代Lombok。
代码示例
// 一行定义数据类
public record User(Long id, String name) {}
public class RecordDemo {
public static void main(String[] args) {
User user = new User(1L,"张三");
System.out.println(user.id()); // 不是getId()
System.out.println(user.name());
System.out.println(user);
}
}
核心特性
- 属性默认
final,没有 setter,默认无无参构造 - 自动生成:全参构造器、组件访问方法、equals ()、hashCode ()、toString ()
- 适合 VO、领域值对象
- 不适合数据库实体、接收前端 JSON 的 DTO(需要无参构造 /setter)
3. instanceof 模式匹配
面试一句话:把
instanceof类型判断 + 强制类型转换合并成一步,匹配成功直接绑定变量,省去手动强转样板代码。
代码示例
public class InstanceofDemo {
public static void main(String[] args) {
Object obj = "hello java17";
// 旧写法:判断类型 + 手动强转
if(obj instanceof String){
String s = (String) obj;
System.out.println(s.length());
}
// Java17新模式匹配,匹配成功自动强转并赋值给s
if(obj instanceof String s){
System.out.println(s.length());
}
}
}
匹配机制原理
- 类型判断:
instanceof先判断 obj 是否为String类型 - 匹配绑定:如果返回 true,自动完成强制类型转换,将引用赋值给模式变量
s - 作用域:模式变量只在满足判断的分支内生效(if 为 true 的代码块)
- null 安全:obj 为 null 时,
instanceof直接返回 false,不会进入分支
4. 文本块 Text Blocks
面试一句话:使用
"""三重引号定义多行字符串,自动保留换行,减少转义符与字符串拼接,适合SQL、JSON、HTML等多行文本。
代码示例
public class TextBlockDemo {
public static void main(String[] args) {
// Java17 文本块 """
String sql = """
SELECT id,name,age
FROM user
WHERE id > 100
ORDER BY create_time DESC
""";
System.out.println(sql);
}
}
核心特性
- 以
"""开头,"""结尾;起始的"""后面不能跟内容 - 自动保留换行,不需要手动写
\n - 会自动处理缩进,以最小缩进为基准对齐
- 内部双引号不需要转义
",不用写成\"
对比旧写法
// 传统多行字符串
String sqlOld = "SELECT id,name,age\n" +
"FROM user\n" +
"WHERE id > 100\n" +
"ORDER BY create_time DESC";
5. 强封装 Strong Encapsulation
面试一句话:Java17默认开启强封装,禁止外部代码通过反射访问JDK内部非公开API(
jdk.internal.*、sun.*),提升JDK安全性与稳定性,官方公开API不受任何影响。
核心概念
- Java8属于弱封装:可以通过反射随意访问
sun.*、jdk.internal.*内部类 - Java17强封装默认启用:JDK未导出模块里的内部类,即使反射也无法访问
- 目的:隔离JDK底层实现,防止业务代码依赖内部私有API,避免JDK升级时代码崩溃
临时放行启动参数(仅开发调试,生产不推荐)
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
参数含义:开放`java.base`模块下`jdk.internal.misc`包,允许所有未命名模块进行反射访问

浙公网安备 33010602011771号