java类型转换有明确规则:自动转换限于小范围→大范围(如byte→int、char→int),安全不丢数据;强制转换需显式声明,但可能导致精度丢失、溢出或classcastexception;boolean不可与其他类型互转,字符串与基本类型互转须防异常,包装类装箱拆箱需避空指针和缓存陷阱。

Java 类型转换不是简单的“套个括号”或“换个变量名”,它背后有明确的规则、隐含的风险和容易被忽略的细节。掌握这些,才能避开编译错误、运行时异常和难以排查的逻辑 bug。
基本类型转换:自动 vs 强制,安全边界在哪
自动转换只发生在小范围类型向大范围类型赋值时,比如 byte → short → int → long → float → double,以及 char → int。这种转换不会丢失数据(浮点精度问题除外),编译器直接允许。
强制转换则必须显式写出,比如 (int) 3.14 或 (byte) 200。它不检查值是否合法,只做截断或低位保留:
- 浮点转整型:直接丢弃小数部分,不是四舍五入 ——
(int) 3.9得到3 - 整型强转:超出目标类型取值范围时发生溢出 ——
(byte) 130变成-126(因为 byte 是有符号 8 位) - 表达式中常被忽略:
byte b = 1; b = b + 1;编译失败,因为b + 1结果是int,必须写成b = (byte)(b + 1)或用复合赋值b += 1(后者自动处理强转)
引用类型转换:向上转型安全,向下转型需验证
子类对象赋给父类引用,是向上转型,编译期自动通过,比如 Object obj = new String("hello");。这是安全的,因为子类具备父类全部能力。
反过来,父类引用转回子类(向下转型),必须显式强转,且运行时才校验实际类型:
- 如果实际不是目标子类,抛 ClassCastException ——
String s = (String) new Object();运行报错 - 稳妥做法是先用
instanceof判断:if (obj instanceof String) { String s = (String) obj; } - 泛型擦除后,运行时无法判断具体泛型类型,所以
List<string></string>和List<integer></integer>在 JVM 中都是List,不能靠类型转换区分
字符串与基本类型互转:别漏掉异常和空值
基本类型转字符串很自由,有多种方式:
-
String.valueOf(123)、Integer.toString(123)、"" + 123 - 推荐
String.valueOf(),它对null安全(返回字符串"null")
字符串转基本类型则必须小心:
-
Integer.parseInt("123")返回int,但输入非数字会抛 NumberFormatException -
Integer.valueOf("123")返回Integer包装类,同样可能抛异常,且要注意缓存范围(-128 到 127)影响==比较结果 - 永远不要假设输入一定合法 —— 特别是来自用户或外部接口的数据,务必加 try-catch 或使用工具类如 Apache Commons 的
NumberUtils.toInt(str, defaultValue)
包装类与自动装箱:便利背后的陷阱
JDK 5 起支持自动装箱(int → Integer)和拆箱(Integer → int),写起来简洁,但暗藏风险:
-
空指针异常(NPE):对
null的包装类变量执行拆箱操作,如Integer i = null; int x = i;直接抛NullPointerException -
缓存陷阱:
Integer.valueOf(100) == Integer.valueOf(100)为true,但Integer.valueOf(200) == Integer.valueOf(200)是false—— 因为只有 -128 到 127 范围内复用对象 -
性能开销:频繁装箱拆箱会创建大量临时对象,尤其在循环中应避免,比如
for (int i = 0; i (list 是 <code>List<integer></integer>)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











