java类型转换是强类型系统的底层规则,核心在于理解范围与安全边界:小转大自动安全,大转小需显式且承担风险;禁止boolean与数值、基本类型与string、无关引用类型间直接转换。

Java 类型转换不是语法糖,而是强类型系统下数据流动的底层规则。掌握它,关键不在背顺序,而在理解“范围”和“安全边界”——小转大自动安全,大转小必须显式且承担风险。
自动转换:只发生在“容器变大”时
当源类型取值范围完全被目标类型覆盖,Java 编译器会静默完成转换。这不是“智能”,而是编译期可验证的安全操作。
- 整数链:byte → short → int → long → float → double(注意:float 虽是 4 字节但能表示极大整数,所以排在 long 后)
- 字符链:char → int → long → float → double(char 是无符号 2 字节,转 int 本质是 Unicode 码值提升)
- 运算中自动提升:int + float → 全部转为 float 再计算;short + byte → 全部提升为 int
强制转换:你签字担责的操作
写 (int) 3.14 或 (byte) 200,等于告诉编译器:“我清楚可能丢精度或溢出,后果自负”。运行时不会报错,但结果可能出人意料。
- 截断不四舍五入:(int) 9.99 得到 9
- 溢出按二进制截取:int i = 200; byte b = (byte) i; 得到 -56(200 的补码低 8 位解释为有符号 byte)
- char 强转需留意:(char) 66 是 'B',但 (char) -1 会得到一个无效 Unicode 字符
哪些转换根本不能做?
有些“看起来合理”的转换,Java 明确禁止,编译直接失败:
- boolean 和任何数值类型互转:true/false 不是 1/0,没有隐式或强制转换路径
- 任意基本类型与 String 直接强转:String 是引用类型,必须用 Integer.parseInt() 或 String.valueOf() 等工具方法
- 不同类继承体系间的引用强转:比如把 ArrayList 强转为 HashMap,编译就过不去
引用类型转换:看对象实际是谁
引用转换不看声明类型,而看堆中对象的真实类型。向上转型(子类→父类)永远安全;向下转型(父类→子类)必须用 instanceof 预判,否则运行时抛 ClassCastException。
- 安全示例:Object obj = "hello"; String s = (String) obj; —— 因为 obj 实际是 String 实例
- 危险示例:Object obj = new Date(); String s = (String) obj; —— 运行时报错
- 推荐写法:if (obj instanceof String) { String s = (String) obj; }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











