Java 基本类型与字面量

Java 八种基本类型与常见字面量:位宽、默认值语境、装箱边界入口,以及数值与字符字面量规则。

#type / concept #status / growing #tech / dev #resource / java

[!info] 关联笔记

Java 基本类型与字面量

这个概念为什么出现

程序要在内存里表示真假、整数、浮点与字符。Java 把这些高频值做成基本类型(primitive types),与对象引用分开:

  • 基本类型变量存的是值本身
  • 引用类型变量存的是指向对象的引用(可为 null

若不先分清,后续“赋值拷贝了什么、为何不能对 int 调方法、装箱为何发生”都会混乱。

[!abstract] 一句话理解 Java 有八种基本类型(booleanbyteshortcharintlongfloatdouble);字面量有类型归属,整数默认 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

结合场景再看三个关注点

  1. 金额不要用 double 做账务真理(本例用重量演示浮点;货币应用 BigDecimal 或整数分)。
  2. long 字面量漏写 L 可能在编译期就按 int 解释而失败或截断意图。
  3. char 不是“完整 Unicode 字符类型”的现代完整答案——代理对与码点细节见字符串篇。

核心概念与准确模型

1. 八种基本类型

类型宽度(规范模型)典型用途
boolean非数值布尔开关、状态
byte8-bit 有符号原始字节、小枚举式编码
short16-bit 有符号较少单用,数组或协议字段
char16-bit UTF-16 code unit字符数据、文本处理中间值
int32-bit 有符号默认整数
long64-bit 有符号大 ID、时间毫秒等
float32-bit IEEE 754省空间浮点(科学/图形等)
double64-bit IEEE 754默认浮点

字段默认值、局部变量“必须赋值后使用”等规则见 变量与作用域

2. 字面量要点

  • 整数默认 int42
  • long42L
  • 浮点默认 double3.14
  • float3.14F
  • 二进制/十六进制:0b10100xFF
  • 下划线提升可读:1_000_000
  • char'A''\n''\u0041'
  • String 是引用类型:"text"(本篇只区分,不展开)

3. 基本类型 vs 包装类型(入口)

  • intInteger 等包装类型用于泛型集合等需要对象的场合
  • 自动装箱/拆箱会引入 null 拆箱 NPE 风险
  • 详细相等性与缓存行为后续在包装/集合相关笔记展开

4. 数值运算的直观后果

  • 整数除法截断:5/2 == 2
  • 浮点有精度误差:比较应用误差范围或整数化
  • 混合类型运算有提升规则:见运算符篇

边界情况与反直觉行为

  1. byte/short 算术常提升到 int,结果赋回 byte 需显式转换。
  2. char 与负数:无符号代码单元,和 byte 互转要小心。
  3. 溢出默默发生int 最大值 +1 绕回,不自动变 long
  4. boolean 不能与 int 互相转换(不像 C)。

常见误区

[!warning] 常见误区:用 double 存钱 错误理解:两位小数用 double 即可。
正确模型:十进制货币用 BigDecimal 或整数最小货币单位。
为何易错:十进制字面量看起来精确。

[!warning] 常见误区:基本类型可以是 null 错误理解:int x = null;
正确模型:只有引用类型可为 null;包装类型可以。
为何易错:与 Kotlin 可空类型或 JS 的松散数字模型混淆。

工程实践

  1. 默认整数用 int,需要更大范围或协议规定再用 long
  2. 公开 API 避免无意义的 short/byte 字段,除非序列化/内存布局需要。
  3. 与外部系统交换数值时明确有符号/端序/十进制格式。
  4. 单测覆盖溢出与边界值(MAX_VALUE)。

本节总结

  • 八种基本类型是 Java 值表示的地基
  • 字面量有默认类型,后缀改变归属
  • 与引用类型的分裂解释了 null、装箱与许多 API 形状

自测题

概念题

  1. 为什么说 String 不是基本类型?

代码推理题

  1. System.out.println(1/2);System.out.println(1/2.0); 输出有何不同?

工程思考题

  1. 订单金额字段在持久化与内存中如何选型?
参考答案
  1. 它是 java.lang.String 对象类型,变量保存引用,可为 null,有方法。
  2. 前者整数除法得 0;后者浮点除法得 0.5
  3. 常用最小货币单位整数或 BigDecimal;避免 double 直接入账。

延伸阅读与资料来源

资料类型支撑内容
JLS Primitive Types and Values规范基本类型定义
JLS Lexical Structure - Literals规范字面量
创建于 2026/7/15 更新于 2026/7/15