Java类型转换核心是明确“谁转给谁”和“谁负责”:自动转换由编译器保障值域安全扩容,强制转换由开发者担责且有截断溢出风险;表达式中byte/short参与运算必提升为int;String与基本类型间无任何强制转换。

Java 类型转换不是加括号那么简单,核心在于理解“谁转给谁”和“谁来负责”。自动转换由编译器兜底,只在值域安全扩容时发生;强制转换由开发者担责,有截断、溢出、静默出错风险。掌握它,关键看范围、查边界、避误用。
自动类型转换:只认范围,不看字节
Java 按可表示数值范围排序,而非字节数大小。安全路径是:
byte → short → int → long → float → double,
char → int(因 char 是 0~65535 的无符号整数)。
- int i = 100; double d = i; ✅ 编译通过,值仍是 100.0
- char c = 'Z'; int code = c; ✅ 自动转为 Unicode 值 90
- float f = 1.5f; long l = f; ❌ 编译失败——方向反了,float 不能自动转 long
- short s = 10; byte b = s; ❌ 编译失败——short 和 byte 不兼容,不在同一条安全链上
强制类型转换:写得出来,不等于转得对
语法是 (目标类型) 值,但结果未必如你所想。它不会报错,而是静默截断或溢出,极易埋坑。
- (int) 7.9 得到 7,不是四舍五入;需四舍五入请用 Math.round(7.9)
- (byte) 200 得到 -56——因为只保留低 8 位补码,超出 -128~127 范围即循环溢出
- long big = 10000000000L; int n = (int) big; → n = -1486618624,明显失真
- 必须转换时,先做范围检查:if (big >= Integer.MIN_VALUE && big <= Integer.MAX_VALUE)
表达式里的类型提升:别信直觉,看规则
哪怕声明的是 byte 或 short,只要参与运算,JVM 就会按规则提升——这是硬性规范,不是优化。
立即学习“Java免费学习笔记(深入)”;
- byte a = 1, b = 2; byte c = a + b; ❌ 编译失败:a + b 结果类型是 int,不能直接赋给 byte
- 正确写法:byte c = (byte)(a + b);
- short s = 10; char c = 'A'; int result = s + c; ✅ 结果一定是 int(二者都升为 int 再算)
- 含 float 或 double 的混合运算,最终结果必为 float 或 double
字符串与基本类型互转:禁用强制转换
String 和基本类型之间不存在任何自动或强制转换。写 (int)"123" 会直接编译失败。
- 字符串 → 基本类型:Integer.parseInt("123")(返回 int)、Double.parseDouble("3.14")
- 字符串 → 包装类:Integer.valueOf("123")(返回 Integer 对象)
- 基本类型 → 字符串:String.valueOf(42)(推荐,支持 null)、Integer.toString(42)
- parseXXX 方法遇到非法格式抛 NumberFormatException,生产环境务必 try-catch


















