java类型转换分自动和强制两种:自动转换是小范围类型(如byte)向大范围类型(如int)的安全升级,编译器隐式处理;强制转换需显式加括号,用于大转小,可能丢失精度或溢出;boolean与其他类型不可互转。

Java 中的类型转换分为自动(隐式)和强制(显式)两种,核心区别在于是否可能发生精度丢失或数据截断。自动转换只在安全、无损的前提下发生;强制转换则需程序员明确声明,承担潜在风险。
哪些情况会自动转换?
自动转换发生在小范围类型向大范围类型赋值时,编译器能确保不丢失信息。常见路径包括:
- byte → short → int → long → float → double
- char → int → long → float → double(注意:char 到 int 是自动的,因为 Unicode 值在 int 范围内)
- 整数字面量(如 100)默认是 int,赋给 long、float、double 时自动提升
例如:long l = 100;、double d = 3.14f; 都合法,无需加任何修饰。
什么时候必须强制转换?
当目标类型比源类型表示范围更小,或二者不兼容(如数值与布尔),编译器拒绝自动处理,必须用括号明确写出目标类型:
-
int → byte / short / char:可能溢出,如
int i = 200; byte b = (byte) i;结果为 -56(因 200 超出 byte 的 [-128, 127]) -
double → float / long / int:浮点转整数会丢弃小数部分,且 double 精度更高,如
double d = 99.99; int n = (int) d;得到 99 -
父类引用指向子类对象时,向下转型需强制:如
Object obj = new String("abc"); String s = (String) obj;
强制转换的风险与检查
强制转换不是万能的,错误使用会导致编译失败或运行时异常:
-
编译期报错:类型完全无关,如
(String) new Integer(1),编译直接拒绝 -
运行时 ClassCastException:向下转型时实际类型不符,如
Object obj = new Integer(1); String s = (String) obj; - 建议配合
instanceof预检:先判断再转,避免崩溃,例如:if (obj instanceof String) { String s = (String) obj; }
字符串与其他类型的互转不算类型转换
像 String.valueOf(int)、Integer.parseInt("123") 这类操作属于“解析”或“格式化”,本质是对象构造或文本处理,不是 JVM 的类型转换机制。它们不会触发自动/强制转换规则,也不会产生 ClassCastException,但可能抛出 NumberFormatException 等业务异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











