Java自动类型转换仅支持“小转大”,如byte→int、int→long,反之需强制转换;boolean与数值、不兼容引用类型间禁止转换;字符串与数字互转须区分parseXxx(基本类型)和valueOf(包装类)。

自动转换只发生在“小转大”时
Java 的自动类型转换(隐式转换)不是无条件的,它严格遵循“容量从小到大”的规则。byte、short、char 可以自动转成 int;int 可以自动转 long、float、double;char 也能自动转 int(变成 ASCII 码值)。但反过来绝对不行——比如 int 不能自动转 byte,编译直接报错。
这种转换安全的核心在于:目标类型有足够的存储空间容纳源值,不会丢数据(浮点数间转换可能有精度损失,但属于例外)。常见场景包括变量赋值、算术表达式运算、方法参数传入和 return 返回值。例如:
void print(int x) { }
byte b = 5;
print(b); // b 自动提升为 int,调用成功
强制转换必须自己兜底风险
当你写 (byte) 1500 或 (int) 9.8,Java 把责任完全交给你。它不做范围检查,也不四舍五入:
- 浮点转整型:直接截断小数部分,(int) 9.8 → 9,不是 10;要四舍五入得用 Math.round()
- 整数溢出:(byte) 1500 只取低 8 位二进制,结果是 -56(补码表示)
- 字符转数值:char c = 'A'; int i = c; 是自动的(→ 65),但反过来 (char) 65 必须显式写括号
这两类转换 Java 明确禁止
有些转换从语义上就不成立,Java 编译器会直接拦住,不给机会犯错:
- boolean 和任何其他类型互转:不能把 true 当 1 用,也不能把 0 转成 false。if("hello")、int x = true; 全部编译失败
- 不兼容的引用类型强转:比如 Set<String> set = new HashSet<>(); List<String> list = (List<String>) set; 编译能过,但运行一定抛 ClassCastException。正确做法是新建容器并复制:new ArrayList<>(set)
字符串与数字互转别混 parseXxx 和 valueOf
这是新手高频踩坑点,关键看返回值类型:
立即学习“Java免费学习笔记(深入)”;
- 字符串 → 基本类型:用 Integer.parseInt("123")(返回 int),Double.parseDouble("3.14")
- 字符串 → 包装类:用 Integer.valueOf("123")(返回 Integer 对象),支持缓存优化
- 基本类型 → 字符串:推荐 String.valueOf(42),或直接 "" + 42;Integer.toString(42) 也行,但不支持 null


















