Java类型转换有严格规则:基本类型自动转换小→大但不保精度,强制转换大→小需手动且风险高,表达式中隐式提升优先于运算,字符串与数字互转须用parseXxx()或valueOf()。

Java 类型转换不是“随便转”,而是有明确规则和边界的行为。掌握它,能避开大量运行时异常和逻辑错误,尤其在数值计算、接口适配和字符串处理中特别关键。
基本类型自动转换:小→大,安全但不保精度
当把范围小的类型赋值给范围大的类型时,Java 自动完成,比如 byte → int、int → long、int → double。这种转换编译器允许,且通常不会丢失数据——但有两个例外:
-
long → float:虽然能自动转(因为 float 表示范围更大),但超过 224 的整数会丢失低有效位,例如
(float) 16777217L结果仍是16777216.0 - long → double:超过 253 后,相邻可表示的 double 值间隔大于 1,也会出现精度丢失
char 是个特例:它和 int 兼容,char c = 'A'; int i = c; 自动转为 ASCII 码 65;但反过来必须强制转换,且要注意 char 是无符号的(0–65535),而 int 是有符号的。
强制类型转换:大→小,需手动且风险高
语法是 (目标类型)值,常见于浮点转整、长整转短整等场景。它不做校验,只做截断或溢出处理:
立即学习“Java免费学习笔记(深入)”;
-
浮点转整型:直接丢弃小数部分,不是四舍五入,
(int) 3.9得3,(int) -3.9得-3 -
整型收缩:高位被截掉,比如
int i = 257; byte b = (byte) i;结果是1(因为只保留低 8 位);而int i = 130; byte b = (byte) i;得-126(补码溢出) - boolean 不参与任何转换:不能转成 int,也不能由字符串解析而来,这是 Java 的类型安全设计
表达式中的隐式提升:运算前就升级了
Java 在算术表达式中会先进行类型提升,再计算。例如:
-
byte a = 1, b = 2; int c = a + b;—— 这里 a 和 b 都被提升为 int 再相加,结果自然是 int -
short s = 1; s = s + 1;编译失败!因为s + 1是 int 类型,不能直接赋给 short,必须写成s = (short)(s + 1) - 更隐蔽的问题:
int x = Integer.MAX_VALUE; long y = (long)(x + 1);结果不是2147483648L,而是-2147483648L—— 因为x + 1先按 int 计算并溢出,再转 long
正确写法是:long y = (long)x + 1; 或 long y = x + 1L;,确保运算阶段就用 long 类型。
字符串与基本类型的互转:别用 + "" 做解析
字符串转数字要用 parseXxx() 方法,而不是靠拼接或强制转换:
-
基本类型 → String:推荐
String.valueOf(x),或直接"" + x(仅限简单场景) -
String → 基本类型:用
Integer.parseInt(s)、Double.parseDouble(s)等,它们会抛出NumberFormatException,需捕获处理 -
空或 null 字符串要提前检查,否则
parseInt(null)直接抛 NPE - 不要写
(int)"123"—— 这在 Java 中根本不存在,编译报错


















