java类型转换是类型安全机制核心,分自动转换(小范围→大范围,如byte→int)、强制转换(主动担责,如(int)3.9得3)和运算提升(byte/short/char运算前先升为int),boolean与void不可转换。

Java 类型转换不是语法糖,而是类型安全机制的核心环节。理解它,关键在于分清“谁转给谁”“为什么能转”“转了会怎样”——而不是死记规则。
自动转换:小范围 → 大范围才安全
Java 只在源类型取值范围完全被目标类型覆盖时,才允许隐式转换。比如 byte(-128~127)→ int(-21亿~21亿),没问题;但 char(0~65535)→ short(-32768~32767)就不行——虽然都是2字节,但 char 是无符号,short 是有符号,范围不兼容,必须强制转换。
- 合法路径只有一条主线:byte/short/char → int → long → float → double
- char 可自动转 int(得到 Unicode 码点),但 int 转 char 必须强制,且结果可能超出可打印字符范围
- 字面量有默认类型:100 是 int,100L 是 long,100.0 是 double,100.0f 是 float
强制转换:不是“加括号就行”,而是“主动担责”
写 (byte) 1500 这个动作,等于告诉编译器:“我知道会丢数据,我负责”。运行时不会报错,但结果是截断低8位后的补码值 —— 1500 的二进制低8位是 00010100,即 20?不对,实际是 1500 % 256 = 228,而 228 在 byte 中表示为 -28(因为 byte 用8位补码,228 → 11100100 → -28)。常见误区是以为“超了就归零”,其实是按模256再映射到有符号区间。
- 浮点转整型一律截断小数部分,(int)3.9 得 3,不是 4
- 需要四舍五入?用 Math.round(),它返回 long,再转 int 也要注意溢出
- long 转 int 时,若数值超出 int 范围(±2147483648),结果是低位32位直接解释为 int,不是报错
运算中的类型提升:别被变量类型骗了
声明为 byte a = 10, b = 20;,但写 a + b 时,Java 会先把它们都提升成 int 再相加。所以表达式结果是 int,不能直接赋给 byte 变量——哪怕你心里算着 30 肯定没超范围。
- 所有 byte、short、char 的算术运算,第一步就是“升格为 int”
- 想存回 byte?必须显式写成 byte c = (byte)(a + b);
- 混合运算如 byte + long,结果是 long;float + double,结果是 double
不可转换的边界:boolean 和 void 是铁墙
Java 明确禁止任何类型与 boolean 互转。这不是疏漏,而是语言设计的底线:逻辑真假必须独立于数值。同样,void 不是类型,不能参与转换;null 不是值,不能强转成基本类型(只能转引用类型,且需类型兼容)。
- if (1)、while ("true")、return 0; 全部编译失败
- 字符串转数字要用 Integer.parseInt(),不是 (int)"123"
- 基本类型和包装类之间靠自动装箱/拆箱,但 null 拆箱会触发 NullPointerException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











