java类型转换遵循“范围决定方向”原则:小范围可自动转大范围,大转小需强制转换并承担溢出风险;布尔型不可与其他类型互转;字符串与数字互转须调用工具方法。

掌握 Java 类型转换,关键在于理解“范围决定方向”——小范围类型可安全转为大范围类型,反之必须显式干预,并承担风险。
自动转换:只发生在安全扩容时
Java 编译器会在赋值或运算中自动把 byte、short、char 提升为 int;再往上,int → long → float → double 也按需自动完成。这种转换不丢失原始值(除极少数浮点精度问题),因为目标类型能完整容纳源值。
- byte b = 100; int i = b; ✅ 自动转,i 值为 100
- char c = 'A'; int code = c; ✅ 自动转,code 值为 65(ASCII)
- int x = 5; double y = x; ✅ 自动转,y 值为 5.0
- 注意:byte 和 short 在参与算术运算时,一律先提升为 int —— 所以 byte a = 1, b = 2; byte c = a + b; 会编译失败,必须写成 byte c = (byte)(a + b);
强制转换:明确意图,但要自己兜底
当你把 long 赋给 int、double 截为 int、或把大整数压进 byte 时,Java 要求你用 (目标类型) 显式声明。这不是语法糖,而是提醒你:可能丢精度、溢出、甚至得到负数。
- (int) 3.9 → 结果是 3(直接截断,不是四舍五入)
- (byte) 200 → byte 范围是 -128~127,200 超出后取补码,结果为 -56
- (char) 66 → 合法,得到字符 'B'
- 布尔值 boolean 不能参与任何数值类型转换,int → boolean 或 boolean → int 都非法
运算中的类型提升:别被表象骗了
混合类型运算时,Java 不看变量声明顺序,而是按表达式中“最大容量类型”统一提升所有操作数。比如 byte + int 实际是 int + int;float + double 全部升为 double 再算。
- short s = 10; int i = 20; var r = s + i; → r 类型是 int
- float f = 1.5f; double d = 2.5; var sum = f + d; → sum 类型是 double
- 避免隐式溢出陷阱:int money = 10_0000_0000; long total = money * 20; ❌ 这里 money * 20 先按 int 算,已溢出;正确写法是 money * 20L 或 (long)money * 20
字符串与数字互转:脱离基本类型体系
String 和基本类型之间没有自动转换关系,必须调用工具方法。这不是类型转换(casting),而是解析/格式化过程。
- int → String:String.valueOf(123) 或 Integer.toString(123)
- String → int:Integer.parseInt("123")(抛 NumberFormatException)
- 带校验更稳妥:try-catch 或用 Integer.valueOf("123")(返回 Integer 对象,空值处理更灵活)
- 注意:"123abc" 转 int 会报错,不能靠强制转换解决
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











