Java类型转换分隐式和显式两类:隐式转换仅限小范围→大范围且无风险的数值提升(如byte→int、char→int),显式转换需强制语法且可能截断或抛ClassCastException。

Java 中的类型转换分自动(隐式)和强制(显式)两类,关键看是否可能丢失信息:能保证不丢精度、不越界的就自动转,否则必须手动加 (TargetType) 强制转换,否则编译直接报错。
哪些情况会自动转换(隐式转换)
自动转换只发生在「小范围 → 大范围」且无数据风险的数值类型之间,比如 byte → short → int → long → float → double,还有 char → int(因为 char 是无符号 16 位,升为有符号 32 位不会溢出)。
-
int赋值给long:合法,long a = 100; -
byte传参到接收int的方法:自动提升,无需 cast -
char + int运算结果是int:字符参与算术运算时自动转为int值(如'a' + 1得 98) - 但
short s = 1; s = s + 1;编译失败:因为s + 1结果是int,不能自动缩回short
什么时候必须用强制转换(显式转换)
只要方向是「大范围 → 小范围」,或涉及可能丢失精度/符号/位数的操作,就必须写 (TargetType),否则编译不通过;运行时还可能因值越界导致静默截断(比如 int 转 byte 时高位被丢弃)。
-
int→byte:byte b = (byte) 1000;(结果是 -24,因为 1000 % 256 = -24) -
double→int:int i = (int) 3.14;(直接截断小数,不是四舍五入) - 父类引用指向子类对象时,向下转型必须强制:
Object obj = new String("hi"); String s = (String) obj;,否则编译报错 - 但
(String) new Integer(1)运行时报ClassCastException——强制转换只管编译时类型兼容性,不检查实际运行时类型
字符串与其他类型的互转(不属于 Java 类型转换体系)
Java 不支持像 JavaScript 那样用 + 或括号直接把字符串和其他类型“转”成对方。字符串转数字要用包装类的静态方法,数字转字符串推荐 String.valueOf() 或字符串拼接(触发自动调用 toString())。
立即学习“Java免费学习笔记(深入)”;
- 字符串转数字:
int i = Integer.parseInt("123");,失败抛NumberFormatException - 基本类型转字符串:
String s = String.valueOf(42);或"" + 42(后者更轻量,但注意避免在循环里拼接) -
Integer对象转int:int x = iObj.intValue();或直接用自动拆箱int x = iObj; - 别写
(int)"123"——这语法根本不存在,编译不过
真正容易被忽略的是:自动转换只发生在编译期可确定安全的场景;而强制转换既承担了「我清楚风险」的语义,又把校验时机推迟到了运行时——尤其是对象类型转换,instanceof 检查漏掉的话,ClassCastException 往往出现在深夜上线后。










