Java 的强制类型转换
Java 的强制类型转换(Type Casting),是指将一种数据类型转换为另一种数据类型的过程。它分为:
🌱 一、两种类型转换方式
类型 | 是否自动 | 举例 | 说明 |
---|---|---|---|
自动类型提升 | ✅ 是 | int → long | 安全 |
强制类型转换 | ❌ 否 | long → int | 可能丢失精度或溢出,需手动加 (目标类型) |
📈 二、自动类型提升(Widening Conversion)
Java 会自动将小范围 → 大范围的数值类型转换,例如:
int i = 100;
long l = i; // 自动提升 ✅
float f = l; // 自动提升 ✅
double d = f; // 自动提升 ✅
自动提升顺序如下(从小到大):
byte → short → int → long → float → double
⚠️ 三、强制类型转换(Narrowing Conversion)
当你要把大范围 → 小范围的类型转换时,就必须手动强制转换:
long l = 123456789L; int i = (int) l; // 强制转换 ❗
⚠️ 风险:
-
可能 丢失数据(精度或高位)
-
可能 出现溢出
例如:
long big = 2147483648L; // 超过 int 最大值 int small = (int) big; System.out.println(small); // 输出:-2147483648 ❗(绕回来了)
🎨 四、数值类型之间的转换规则图
byte → short → int → long → float → double
反过来都需要强制转换:
double → float → long → int → short → byte
🧠 五、类型转换中发生了什么?(本质)
以 (int) 3.6
为例:
-
浮点数变整数时,会截断小数部分,不会四舍五入:
int x = (int) 3.6; // x = 3
-
精度丢失示例:
float f = 1_000_000_001; // 会精度丢失,float 只能保证大约 7 位有效数字
🧪 六、特殊类型之间是否能转换?
类型 | 是否能转换 | 说明 |
---|---|---|
boolean ↔ 其他类型 | ❌ 不允许 | Java 不支持布尔和数字间的转换 |
char ↔ int | ✅ 可以 | char 本质是无符号整数(UTF-16) |
char c = 'A'; int code = (int) c; // 65
🧾 七、推荐写法建议
-
能用自动提升就用,不要随意用强制转换
-
强制转换前先判断值是否在目标类型的范围内(防止溢出)