java类型转换是运行时硬性约束,决定数值截断、表达式提升与方法匹配;隐式转换仅限值域安全扩容,强制转换需显式声明但不保证安全,表达式运算前必按规则提升类型,boolean不可转换,包装类拆箱遇null抛异常。

Java 类型转换不是语法糖,而是运行时的硬性约束——它直接决定数值是否被截断、表达式如何提升、方法如何匹配。写错一行转换,可能让结果变成负数或 0,却编译通过、毫无警告。
隐式转换只发生在“值域安全扩容”时
Java 允许小范围类型自动转为大范围类型,但判断依据不是字节大小,而是可表示的数值范围宽度:
- byte(-128~127)→ short → int → long → float → double
- char(0~65535)→ int(因无符号且值域完全包含于 int)
- float 虽仅 4 字节,但能表示比 long 更大的数(如 1e38),所以排在 long 后
典型场景包括赋值和方法调用:一个 byte b = 100 可直接传给 void print(int x),也会自动升为 double 调用 print(double)。
强制转换必须显式声明,且自带风险
目标类型容量更小时,必须加 (Type),但这只是“允许编译”,不等于“安全可用”:
-
数值溢出:比如
(byte)1500保留低 8 位,结果是 -56(补码截断) -
精度丢失:
(int)3.14直接丢弃小数部分得 3,不是四舍五入;(int)3.99同样是 3 - 需四舍五入请用
Math.round(x)(返回 long),再转 int 也需检查范围
表达式中的类型提升有固定规则
哪怕你声明的是 byte a, b,只要写 a + b,JVM 就会先把它们都提升为 int 再运算——这是规范,不是优化:
-
byte c = a + b;编译失败,因为a + b结果是int - 正确写法是
byte c = (byte)(a + b); - 混合类型如
short + char + int,最终结果一定是int;含float或double则升为对应浮点类型
几个关键边界必须牢记
有些转换看似合理,实则严格禁止或易出错:
-
char可与整数互转(如(char)65→'A'),但它是无符号类型,强转负数会得到意外字符 -
boolean严禁任何形式的转换:不能转成int,也不能被其他类型转 - 包装类(如
Integer)与基本类型之间靠自动装箱/拆箱,但null拆箱会抛NullPointerException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











