AIGC标识 Java17新特性

Java17 新特性(面试笔记)

目录


1. 密封类 Sealed Classes

面试一句话:密封类用来精确控制哪些类可以继承当前类,填补 final(完全禁止继承)和普通类(任意都能继承)中间的空白。

核心概念

  • 使用 sealed 修饰类/接口,搭配 permits 指定允许继承的子类
  • 被允许的子类,只能三选一:
    1. final:不能再被继承(终止继承链)
    2. sealed:继续密封,继续限制它自己的子类
    3. 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());
        }
    }
}

匹配机制原理

  1. 类型判断:instanceof 先判断 obj 是否为 String 类型
  2. 匹配绑定:如果返回 true,自动完成强制类型转换,将引用赋值给模式变量s
  3. 作用域:模式变量只在满足判断的分支内生效(if 为 true 的代码块)
  4. 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);
    }
}

核心特性

  1. 以 """ 开头,""" 结尾;起始的"""后面不能跟内容
  2. 自动保留换行,不需要手动写\n
  3. 会自动处理缩进,以最小缩进为基准对齐
  4. 内部双引号不需要转义 ",不用写成 \"

对比旧写法

// 传统多行字符串
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`包,允许所有未命名模块进行反射访问
posted @ 2026-09-26 14:43  赵登科  阅读(2)  评论(0)    收藏  举报