Java 基本类型与字面量
Java 八种基本类型与常见字面量:位宽、默认值语境、装箱边界入口,以及数值与字符字面量规则。
#type / concept
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
- 所属 MOC:语言基础 · 学习路线
- 前置概念:程序结构与 main
- 后续概念:变量与作用域 · 运算符与表达式 · 字符串
- 容易混淆:null 与 Optional · 数组
Java 基本类型与字面量
这个概念为什么出现
程序要在内存里表示真假、整数、浮点与字符。Java 把这些高频值做成基本类型(primitive types),与对象引用分开:
- 基本类型变量存的是值本身
- 引用类型变量存的是指向对象的引用(可为
null)
若不先分清,后续“赋值拷贝了什么、为何不能对 int 调方法、装箱为何发生”都会混乱。
[!abstract] 一句话理解 Java 有八种基本类型(
boolean、byte、short、char、int、long、float、double);字面量有类型归属,整数默认int、浮点默认double,更大范围需L/F等后缀。
最小可运行示例
先把示例放进业务场景,再看代码:
场景:仓储服务上报一件 SKU 的基础计量字段
一次库存心跳包含:是否在售、件数、克重、温区代码字符、货架编号。
教学点:各基本类型的典型业务字段、字面量后缀、char 与整数的关系。
public class SkuHeartbeat {
// report:组装一条可打印的库存心跳。
//
// 业务意图:用基本类型表达“不会空”的计量字段。
// 教学点:
// - boolean/int/long/double/char 的分工;
// - 长整型字面量用 L;浮点默认是 double;
// - char 本质是 UTF-16 代码单元(BMP 内常当“一个字符”用)。
static void report() {
boolean onShelf = true; // 是否在架可售
byte zoneCode = 3; // 温区编码:小范围整数
short shelfNo = 1204; // 货架号
int quantity = 42; // 件数
long skuId = 10000000001L; // 业务 ID,超出 int 舒适区时用 long
float humidity = 0.55F; // 显式 float 后缀
double weightGram = 12.5; // 默认 double
char grade = 'A'; // 等级字符
System.out.println(onShelf + " " + zoneCode + " " + shelfNo);
System.out.println(quantity + " " + skuId);
System.out.println(humidity + " " + weightGram + " " + grade);
// char 可参与算术:拿到代码单元数值(教学向,业务里慎用)。
System.out.println("gradeCode=" + (int) grade);
}
public static void main(String[] args) {
report();
}
}
建议运行:
javac SkuHeartbeat.java && java SkuHeartbeat
期望输出(核心字段):
true 3 1204
42 10000000001
0.55 12.5 A
gradeCode=65
结合场景再看三个关注点
- 金额不要用
double做账务真理(本例用重量演示浮点;货币应用BigDecimal或整数分)。 long字面量漏写L可能在编译期就按int解释而失败或截断意图。char不是“完整 Unicode 字符类型”的现代完整答案——代理对与码点细节见字符串篇。
核心概念与准确模型
1. 八种基本类型
| 类型 | 宽度(规范模型) | 典型用途 |
|---|---|---|
boolean | 非数值布尔 | 开关、状态 |
byte | 8-bit 有符号 | 原始字节、小枚举式编码 |
short | 16-bit 有符号 | 较少单用,数组或协议字段 |
char | 16-bit UTF-16 code unit | 字符数据、文本处理中间值 |
int | 32-bit 有符号 | 默认整数 |
long | 64-bit 有符号 | 大 ID、时间毫秒等 |
float | 32-bit IEEE 754 | 省空间浮点(科学/图形等) |
double | 64-bit IEEE 754 | 默认浮点 |
字段默认值、局部变量“必须赋值后使用”等规则见 变量与作用域。
2. 字面量要点
- 整数默认
int:42 long:42L- 浮点默认
double:3.14 float:3.14F- 二进制/十六进制:
0b1010、0xFF - 下划线提升可读:
1_000_000 char:'A'、'\n'、'\u0041'String是引用类型:"text"(本篇只区分,不展开)
3. 基本类型 vs 包装类型(入口)
int↔Integer等包装类型用于泛型集合等需要对象的场合- 自动装箱/拆箱会引入
null拆箱 NPE 风险 - 详细相等性与缓存行为后续在包装/集合相关笔记展开
4. 数值运算的直观后果
- 整数除法截断:
5/2 == 2 - 浮点有精度误差:比较应用误差范围或整数化
- 混合类型运算有提升规则:见运算符篇
边界情况与反直觉行为
byte/short算术常提升到int,结果赋回byte需显式转换。char与负数:无符号代码单元,和byte互转要小心。- 溢出默默发生:
int最大值 +1 绕回,不自动变long。 boolean不能与int互相转换(不像 C)。
常见误区
[!warning] 常见误区:用 double 存钱 错误理解:两位小数用 double 即可。
正确模型:十进制货币用BigDecimal或整数最小货币单位。
为何易错:十进制字面量看起来精确。
[!warning] 常见误区:基本类型可以是 null 错误理解:
int x = null;
正确模型:只有引用类型可为 null;包装类型可以。
为何易错:与 Kotlin 可空类型或 JS 的松散数字模型混淆。
工程实践
- 默认整数用
int,需要更大范围或协议规定再用long。 - 公开 API 避免无意义的
short/byte字段,除非序列化/内存布局需要。 - 与外部系统交换数值时明确有符号/端序/十进制格式。
- 单测覆盖溢出与边界值(
MAX_VALUE)。
本节总结
- 八种基本类型是 Java 值表示的地基
- 字面量有默认类型,后缀改变归属
- 与引用类型的分裂解释了 null、装箱与许多 API 形状
自测题
概念题
- 为什么说
String不是基本类型?
代码推理题
System.out.println(1/2);与System.out.println(1/2.0);输出有何不同?
工程思考题
- 订单金额字段在持久化与内存中如何选型?
参考答案
- 它是
java.lang.String对象类型,变量保存引用,可为 null,有方法。 - 前者整数除法得
0;后者浮点除法得0.5。 - 常用最小货币单位整数或
BigDecimal;避免 double 直接入账。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| JLS Primitive Types and Values | 规范 | 基本类型定义 |
| JLS Lexical Structure - Literals | 规范 | 字面量 |