知其然,知其所以然
Java 内部原理 2026-10-03

var 的类型推断边界

用 javac 的错误信息读出 var 推断出的类型(25 个例子:钻石变 ArrayList<Object>、交集类型、捕获类型、匿名类),列出 var 不能用的位置的 9 种编译错误,验证 var 与显式类型的 class 文件完全相同,以及钻石、重载、静态类型与 int 溢出的陷阱。

Java var 局部变量类型推断 类型系统 真实验证 动画演示
Java 内部原理 2026-10-03

Switch 守卫条件与复杂模式

逐项验证 Java 21 switch 的守卫与复杂模式:支配与穷尽规则、绑定变量在守卫里的限制、嵌套 record 与泛型 sealed 的穷尽性、限定枚举常量;运行期守卫求值与 MatchException;模式 switch 89 ms 对 instanceof 链 34 ms;发现 javac 对守卫里的受检异常不报错。

Java switch when守卫 record模式 sealed 真实验证 动画演示
Java 内部原理 2026-10-03

原始类型模式匹配

用同样的 8 段代码在 JDK 21、JDK 27、JDK 27 加预览三种环境下验证原始类型模式:JDK 21 全部编译失败,JDK 27 要加 --enable-preview 才能用;instanceof 作为「能否精确转换」的测试(int→byte、int→float、double→float、int→char 的边界);switch 可以用 long、boolean、double。

Java 原始类型模式 instanceof switch 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

未命名变量与未命名模式

在 JDK 21(无预览、加预览)与 JDK 27 上真实验证未命名变量与模式 _:catch、for、try-with-resources、lambda、record 模式里的 _,case A _, B _ 的合并分支;JDK 21 不加预览全部失败;未命名变量不进局部变量表;_ 自 Java 9 起是关键字。

Java 未命名变量 未命名模式 下划线 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

隐式声明类与实例 main

在 JDK 21(无预览、加预览)与 JDK 27 上真实验证 main 的新形态:static 无参、实例 main、继承的 main、顶层方法与字段;两个版本里 static 无参与实例 main(String[]) 的选择顺序不同;JDK 27 有隐式 import 与 IO.println;编译出 final class Hello 与 void main()。

Java 隐式声明类 实例main 紧凑源文件 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

字符串模板设计

在 JDK 21(无预览、加预览)与 JDK 27 上真实编译字符串模板:只有 JDK 21 加预览能通过(STR、FMT、RAW、自定义处理器),JDK 27 报 illegal escape character;STR 简单模板编成 invokedynamic 拼接;自写处理器可把值参数化;不用模板的替代写法。

Java 字符串模板 STR StringTemplate 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

enum 的初始化顺序

真实运行验证枚举的初始化:常量先于 static 块、构造器读静态字段的编译限制、哪些访问触发初始化、javap 看 $VALUES 与 values() 的 clone、反射不能创建枚举、初始化失败后 NoClassDefFoundError、两个枚举的循环引用。

Java 枚举 类初始化 clinit values 反射 真实验证 动画演示
Java 内部原理 2026-10-03

接口默认方法冲突

真实编译验证接口默认方法冲突:两个无关默认方法必须覆盖;抽象不让位;更具体的接口胜出;类优先;X.super 只能指直接父接口;单独编译后新增 default 导致运行时 IncompatibleClassChangeError;字节码用 invokespecial InterfaceMethod。

Java 默认方法 接口 菱形继承 二进制兼容 真实验证 动画演示
Java 内部原理 2026-10-03

注解继承与组合

真实运行验证注解的继承:@Inherited 只对类、只沿 extends 链;方法、参数与接口上的注解不继承;可重复注解加 @Inherited 时 getAnnotationsByType 与 getAnnotations 的差别;SOURCE/CLASS/RUNTIME 在 class 文件与反射里的可见性。

Java 注解 Inherited Repeatable 反射 真实验证 动画演示
Java 内部原理 2026-10-03

AtomicFieldUpdater:不增加字段就获得原子更新

真实运行验证 AtomicIntegerFieldUpdater 的使用限制与异常:必须 volatile、不能 static/final、类型要匹配;跨包的访问权限;子类里的 NoSuchFieldException;100 万对象下比 AtomicInteger 字段每对象省约 14 字节。

Java AtomicFieldUpdater CAS volatile 内存 真实验证 动画演示
Java 内部原理 2026-10-03

VarHandle 内存屏障:从访问模式到可见性

真实运行验证 VarHandle:31 种访问模式在字段、数组、byte[] 视图上的支持情况、调用类型规则与各种异常、字节码里的签名多态调用,以及消息传递小实验(没有复现重排序,如实记录)。

Java VarHandle 内存屏障 访问模式 内存模型 真实验证 动画演示
Java 内部原理 2026-10-03

@Contended 与伪共享

真实运行验证伪共享:两个线程各自自增相邻的 volatile long 约 2.98 秒,手工填充或 @Contended(需 -XX:-RestrictContended)约 0.45 秒;Unsafe 读出字段偏移,看到 JVM 重排字段与 128 字节填充;不开选项时 @Contended 在用户类里被静默忽略。

Java 伪共享 Contended 缓存行 性能 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号