Java类型转换是强类型语言运行的底层逻辑,决定运算合法性、结果准确性及程序稳定性;包含自动转换(小变大)、强制转换(大变小)、字符串与基本类型互转、装箱拆箱四类,各有规则与陷阱。

Java 类型转换不是语法糖,而是强类型语言运行的底层逻辑。它直接决定运算是否合法、结果是否准确、程序是否会崩溃。理解它,才能避开溢出、精度丢失、ClassCastException 这些高频陷阱。
自动转换:小变大,安全但有边界
当 byte、short、char 或 int 值参与运算或赋值给更大范围类型时,Java 自动提升——比如 int → long、char → int、int → double。这种转换不写括号,编译器默默完成。
- char 和 int 之间可自动转:char c = 'A'; int code = c; // 得到 65
- 运算中会统一提升:byte x = 10; short y = 20; int z = x + y; // x、y 先升为 int 再相加
- float 虽只有 4 字节,却排在 long(8 字节)之后,因为小数表达能力优先级更高;long → float 是自动的,但可能丢失整数精度(如大 long 值转 float 后末尾数字归零)
- boolean 不能参与任何自动转换,char 和 short 互不兼容,也不能自动转成彼此
强制转换:大变小,要动手,更要小心
把 double 赋给 int、long 赋给 byte、父类引用转子类对象——这些必须显式加括号,告诉编译器“我清楚后果”。语法是 (目标类型)源值,例如 (int)3.9 得到 3,(byte)257 得到 1(因 byte 只能存 -128~127,257 对 256 取模后为 1)。
- 整数截断:double d = 123.99; int i = (int)d; // 结果是 123,小数部分直接丢弃,不是四舍五入
- 溢出风险:int big = 3000000000; byte b = (byte)big; // 超出 byte 范围,结果不可预测(通常是低位字节)
- 引用类型向下转型:Animal a = new Dog(); Dog d = (Dog)a; // 编译通过,但若 a 实际是 Cat 就抛 ClassCastException
- 安全做法:转型前用
instanceof判断,比如if (a instanceof Dog) { Dog d = (Dog)a; }
字符串与基本类型互转:不在自动/强制体系内,靠工具方法
String 和 int、double 等之间没有内置转换关系,不能用 (int)"123" 这种写法。必须调用包装类的静态方法:
立即学习“Java免费学习笔记(深入)”;
- 字符串 → 数字:
int i = Integer.parseInt("123");、double d = Double.parseDouble("3.14"); - 数字 → 字符串:
String s = String.valueOf(42);或更常用"" + 42、Integer.toString(42) - 注意异常:parseInt 遇到非数字字符串会抛 NumberFormatException,生产环境需 try-catch
装箱与拆箱:自动但隐含风险
Integer、Double 等包装类和对应基本类型间,Java 提供自动装箱(int → Integer)和拆箱(Integer → int)。表面省事,背后藏坑:
- 空指针:Integer i = null; int x = i; // 拆箱时触发 NullPointerException
- 缓存陷阱:Integer a = 127, b = 127; System.out.println(a == b); // true(缓存范围内);Integer c = 128, d = 128; System.out.println(c == d); // false(超出缓存,新建对象)
- 比较建议:数值比较用
equals()或直接比基本类型,避免用 == 比包装类引用


















