java类型转换遵循“小转大自动、大转小强制”原则,涉及内存容量、数值范围与编译安全;自动转换如byte→int安全无损,强制转换如double→int可能截断或溢出,boolean及无关引用类型间禁止转换。

Java 类型转换不是简单的“换类型”,而是围绕内存容量、数值范围和编译安全展开的一套严格规则。核心就两点:小转大自动完成,大转小必须显式声明,且可能丢数据或出错。
自动类型转换:只增不减,安全可靠
当把占用空间更小、取值范围更窄的类型赋给更大类型时,Java 编译器会悄悄帮你完成转换,不写任何符号,也不报错。
- 常见路径包括:byte → short → int → long → float → double,以及 char → int → long → float → double
- 整数字面量(如 100)默认是 int,浮点字面量(如 3.14)默认是 double,所以
double d = 100;是合法的自动转换 - 方法调用中也适用:如果方法参数是
int,传入byte或short值,会自动提升后再传入 - 表达式运算时统一升级:比如
int + double,int先转成double,再做加法,结果也是double
强制类型转换:高转低要动手,风险需自担
把大范围类型往小范围类型塞,Java 不允许“默认冒险”,必须用 (目标类型) 显式写出,否则编译失败。
- 语法很简单:
int i = (int) 9.99;结果是 9(小数直接截断,不是四舍五入) -
byte b = (byte) 200;结果是 -56——因为byte最大只能存 127,超出后按二进制补码溢出计算 -
char和short都是 2 字节,但彼此不兼容:short s = 'A';编译报错,必须写成short s = (short) 'A'; - 运算中容易忽略隐式提升:比如
byte b = 10; b = b * 2;会报错,因为b * 2结果是int,赋回byte必须强制转换:b = (byte)(b * 2);
哪些转换根本不允许?边界要清楚
Java 的强类型设计从源头堵住歧义,以下情况连强制转换都不让发生。
-
boolean 不能和任何数值类型互转:既不能
(int) true,也不能if (1),这是编译级禁止 -
基本类型和引用类型不能直转:不能把
int强转成String,也不能把Integer强转成int(虽然自动拆箱能实现,但那是语法糖,不是类型转换) -
无关引用类型之间不可强转:比如
String和ArrayList没继承关系,(ArrayList) str编译失败 -
char转int是自动的(得到 Unicode 码),但反过来必须强制,且要确认数值在0~65535范围内,否则转出乱码字符
实际开发中的关键提醒
类型转换看着简单,但线上 bug 往往藏在细节里。
- 精度丢失比溢出更隐蔽:比如用
float存金额,0.1f + 0.2f可能不等于0.3f;金融场景务必用BigDecimal或long(单位为分) - 做强制转换前,建议先检查范围:
if (value >= Byte.MIN_VALUE && value ,避免静默错误 - 涉及时间戳、文件大小等大数,优先选
long并加L后缀,别依赖自动提升 - 字符串转数字不要靠强制转换,要用
Integer.parseInt()等工具方法,它们抛异常可捕获,比截断更可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











