类型与变量
data-types、variables、type-casting。
30 分钟
类型与变量
java-data-types 与 java-variables 已引入基本类型——本课聚焦 引用 vs 值、装箱拆箱、类型转换与 var,减少「能编译但语义错」的代码。
学习目标
- 区分基本类型与引用类型的内存语义
- 安全使用自动装箱、拆箱与
null - 掌握 widening / narrowing 与
instanceof模式匹配
基本类型 vs 引用类型
| 基本类型 | 引用类型 | |
|---|---|---|
| 存储 | 栈上值(局部变量) | 栈上引用 → 堆上对象 |
| 默认 | 数值 0、boolean false | null |
| 比较 | == 比数值 | == 比引用;内容用 equals |
int count = 0;
String slug = "java-core-essentials"; // 引用指向字符串池或堆对象
Integer boxed = 42; // 自动装箱
int unboxed = boxed; // 自动拆箱,boxed 为 null 时 NPE
习惯:集合与泛型用包装类型或对象;算术热点路径可用 int 避免装箱开销。
类型转换
long millis = 1_500L;
int order = (int) millis; // narrowing,可能丢失精度
Object obj = "hello";
if (obj instanceof String s) { // JDK 16+ 模式匹配
System.out.println(s.toUpperCase());
}
- widening(小→大)隐式安全:
int→long - narrowing(大→小)需显式 cast
- 引用向下转型前用
instanceof校验
var 局部变量
var lessons = new ArrayList<Lesson>(); // 推断为 ArrayList<Lesson>
var slug = "jvc-types"; // 推断为 String
// var x = null; // 编译错误:无法推断
var 只用于 局部变量 且 必须有初始化;API 签名仍写显式类型。
与进阶课的关系
java-advanced-essentials 会讲 record、sealed class 等 新型引用类型;本课先把 经典类型系统 吃透。
练习
- 写一段代码演示
Integer为null时拆箱的 NPE,并用Objects.requireNonNull规避