java类型转换遵循安全与明确原则:小转大自动拓宽,大转小需显式强制转换并承担溢出或精度丢失风险。

Java 类型转换的核心在于“安全”与“明确”两个原则:小范围类型自动转大范围类型是安全的;大转小必须显式声明,并承担精度丢失或溢出风险。
自动类型转换(隐式拓宽)
编译器在不丢失信息的前提下,自动将取值范围小的类型提升为更大的类型。这包括数值类型间的层级转换,以及 char 到整数类型的自然映射。
- 层级路径固定:byte → short → int → long → float → double;char → int → long → float → double
- 赋值时发生:int i = 100; long l = i; // i 自动转 long
- 表达式中提升:byte b = 10; int result = b + 5; // b 先升为 int 再运算
- 方法传参适配:void print(double d) {};print(42); // int 字面量自动转 double
- 注意:float 虽仅 4 字节,但因 IEEE754 表示法,能容纳所有 long 整数值(可能损失精度)
强制类型转换(显式截断)
当目标类型容量不足以完整容纳源值时,必须用 (Type) 显式声明。此时编译器放弃检查,运行时直接截断高位或丢弃小数部分。
- 语法统一:(目标类型)源值,如 int i = (int) 3.9; // 得 3
- 典型风险场景:
- int → byte:int x = 200; byte b = (byte) x; // 结果为 -56(超出 -128~127 溢出)
- long → int:long big = 3_000_000_000L; int small = (int) big; // 高位被截,得 -1294967296
- double → int:double d = 1e10; int i = (int) d; // 精度严重丢失,结果不可靠
- 建议:转换前做范围校验,例如 if (value >= Byte.MIN_VALUE && value
字符与数值的特殊关系
char 是无符号 16 位整数(0~65535),不是“字符类”,而是数值类型,因此和 int、short 等存在天然兼容性。
- char 可自动转 int:char c = 'A'; int code = c; // code = 65
- int 转 char 需强制:int code = 66; char c = (char) code; // c = 'B'
- 注意:char 不能自动转为 byte 或 short(虽同为整数,但 char 是无符号,byte/short 有符号,语义不兼容)
包装类与字符串的桥接转换
基本类型与引用类型之间、与字符串之间的转换不属于 JVM 原生类型系统,而是通过标准 API 实现,需区分自动装箱/拆箱与显式解析。
- 自动装箱/拆箱(Java 5+):Integer i = 100; // int → Integer;int x = i; // Integer → int
- 字符串转数字:int n = Integer.parseInt("123"); double d = Double.parseDouble("3.14")
- 数字转字符串:String s1 = String.valueOf(42); String s2 = 42 + ""; // 本质调用 valueOf
- 避免空指针:parseXXX() 对 null 抛 NumberFormatException;valueOf() 返回 null 包装对象(拆箱时可能 NPE)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











