一、JDK 新特性全解析
JDK9 - 模块化:化繁为简的魔法
模块化特性 :JDK9 给 Java 程序带来模块化特性,就像把一个大公司划分成多个部门,每个部门(模块)各司其职。模块比包更大,一个模块包含多个包,而包又包含多个类。模块化改造 :设想一个大型系统应用,原本账户管理、数据库服务、用户管理等功能混在一起,一团乱麻。现在用 JDK9 模块化改造,把它们分别放进独立模块,每个团队专注维护自己的模块,互不干扰。模块间依赖清晰,通过 module-info.java 文件定义,这个文件是模块的核心,指明模块对外暴露哪些包、引入哪些模块,让模块间合作变得井然有序。创建模块时,先在 IDEA2022 中新建工程,选择 JDK18(兼容 JDK9 特性),然后在工程下创建子模块,如数据库服务模块,右键点击 src 目录,选择新建 module-info.java 文件,若 IDEA2022 版本不显示此选项,可将项目结构中的 SDK 和语言级别临时降至 JDK9,创建后再改回。模块间关系 :模块间依赖关系由 IDEA 管理,记录在每个模块的 .iml 文件中,如 user service 依赖 db service,就通过在 module-info.java 文件中 requires 关键字引入 db.service 模块,并在 IDEA 中添加依赖,让 IDEA 知道 user service 需要 db service 的支持。运行程序时,IDEA 会先编译被依赖模块,再编译当前模块,保证程序完整运行。模块化优势 :模块化让大型工程拆分成多个独立模块,每个模块是独立小工程,便于不同团队分工维护,提高工作效率,降低出错风险。
JDK11 - HTTP 客户端:开启网络通信新时代
HTTP/2 协议 :JDK11 推出全新 HTTP 客户端,完整支持 HTTP/2 协议,相比传统 HTTP/1.x 协议优势明显。它采用二进制帧结构代替文本报文,数据传输更快更高效。还具备头部压缩、流量控制、多路复用、请求优先级、服务器推送等特性,减少传输开销、提升稳定性、提高连接效率、优化网络资源利用,让网络通信更畅快。HttpClient 开发 :通过实例化 HttpClient、构建请求对象、发送请求处理响应三个步骤来使用新版 HTTP 客户端。实例化 HttpClient 时,通过构造者模式并声明网络协议版本为 HTTP/2。构建请求对象时,确定 URL 和请求类型(如 GET)。发送请求时,可选择同步(阻塞)或异步(非阻塞)方式。异步处理效率更高,通过回调函数获取数据,利用 CompletableFuture 对象处理异步返回结果,让程序在网络通信时更灵活高效。
JDK15 - 隐藏类:幕后英雄的崛起
隐藏类概念 :隐藏类是 JDK15 引入的特性,是一种特殊的类,不能被其他类直接使用,只能通过反射机制调用。它们多用于框架运行时动态生成类,如 Lambda 表达式在运行时生成的类就是隐藏类,不像普通类那样在编译时生成字节码文件,而是动态诞生,使命完成后默默消失,不占用多余内存。隐藏类作用 :隐藏类为框架设计量身定制,在高级框架(如 Spring)运行时生成各类动态类,管理更便捷。由于只能通过反射访问,使用有门槛,保障了类的安全性。还能独立加载卸载,减少内存占用,提高程序执行效率,是优化程序性能的幕后英雄。隐藏类应用 :在 IDEA2022 中用 JDK18 创建工程演示,JDK15 环境下实现 Runnable 接口匿名类,运行后发现 out 目录下动态生成内部类文件,而用 Lambda 表达式处理时,生成的类是隐藏类,不会写入磁盘,运行结束即被回收,充分体现隐藏类 “用完即走” 的特性。创建隐藏类可调用 JAVA.lang.invoke 包中 MethodHandles 类的 defineHiddenClass 方法,但日常开发较少用到。
JDK16 - Records 类:简洁数据载体的新选择
Records 目标 :开发中常创建实体类或数据载体类,包含诸多私有属性及相应 get、set、toString、hashCode 等方法,IDE 虽能自动生成,但依然繁琐,代码冗长。JDK16 推出 records 类,扩展 Java 语法,提供紧凑语法形式,编译器自动创建这些方法,让开发者轻松定义数据载体类。Records 使用 :创建 records 类时,在 JDK16 包下新建 JAVA 类,选择 record 而非 class,输入类名及成员变量括号,如 record User(String username, String password, int age, User parent),编译器便自动生成构造方法、访问方法、toString 等方法。使用时,直接实例化对象并传入参数,访问属性时无需 get 方法,直接用对象点属性名获取,简洁高效。Records 使用限制 :records 类不能定义为抽象类,所有成员变量默认 final 修饰,不可更改,限制了应用场景,如不能直接修改数据库查询出的用户密码。也不能直接新增实例字段,但允许出现静态变量、实例方法、静态方法。自定义构造方法时,必须调用 record 构造方法。此外,records 类不能继承其他类,继承性受限,虽有局限,但在特定场景高效便捷。
JDK17 - 密封类:继承关系的守门人
密封类作用 :JDK17 引入密封类,旨在限制父类子类继承关系,防止未经授权的子类继承父类引发问题。父类开发者通过 sealed 和 permits 关键字明确允许哪些子类继承父类,形成密封的继承闭环,确保代码安全可控。密封类使用 :例如公司开发 job 父类及 developer、manager、salesman 子类,为防止其他未经授权子类继承 job,将 job 类声明为 sealed 类,并在 permits 后列出允许的子类。子类可进一步用 final、non-sealed(默认,可被任意子类继承)、sealed(限定子类)修饰,明确子类继承规则。同时,密封类要求子类与父类在同一包下,进一步限制子类范围,保障继承体系稳定有序。
JDK18 - 默认 UTF-8 编码:字符编码的统一者
UTF-8 编码缘由 :以前 JDK 字符集标准不统一,网络传输、文件读写等易出现中文乱码。JDK18 统一默认字符集为 UTF-8,让 API 在不同操作系统、区域设置下表现一致,解决乱码痛点。乱码问题演示及解决 :在 JDK18 中,若控制台编码与程序输出编码不一致(如程序用 UTF-8,控制台用 GBK),会出现乱码。解决方法一是让控制台改用 UTF-8 输出,在 IDEA 中点击 File->Settings->Editor->General->Console,将控制台编码改为 UTF-8。方法二是让程序输出改用 GBK 编码,在代码运行配置中添加 VM 选项 “-Dfile.encoding=GBK”,确保控制台与程序输出字符集一致,中文便能正常显示。还可在 IDEA 中编辑配置模板,为所有程序默认添加 “-Dfile.encoding=GBK”,省去每次设置麻烦。
二、JDK 新特性总结
JDK9 :模块化特性,增加模块层,切分包便于管理。JDK11 :全新 HTTP 客户端,支持 HTTP/2 协议。JDK15 :隐藏类,用于框架运行时动态生成类,生命周期短。JDK16 :records 类,封装纯数据,替代 JAVA Bean,实例化后属性不可变。JDK17 :密封类,控制父类子类继承关系,限定子类范围及继承性。JDK18 :默认 UTF-8 编码,统一输入输出编码,解决乱码问题。