【Java】显式转换和隐式转换
在 Java 中,不同数据类型之间可以进行转换,主要分为两种:
- 显式类型转换 (Explicit Type Conversion / Casting - 强制类型转换):
- 定义:指程序员在代码中明确使用转换语法(即 (目标类型)值这种形式),强制将一个类型的值转换为另一个类型。
- 场景:通常发生在需要将大范围(或高精度)类型转换为小范围(或低精度)类型时(称为窄化转换,Narrowing Conversion)。例如,将 double 转换为 int,或将 int 转换为 byte。
- 特点:需要手动操作,因为这种转换可能会导致数据丢失(如小数部分被截断)或溢出(值超出目标类型的范围而被截断)。程序员通过显式转换表明自己已了解并接受这种风险。
- 例子:
double d = 9.8; int i = (int)d; // i 的值会是 9,小数部分丢失
int largeInt = 300; byte b = (byte)largeInt; // b 的值会因溢出而截断,变成 44 (300 % 256)
-
隐式类型转换 (Implicit Type Conversion / Promotion - 自动类型提升):
- 定义:指在特定情况下,编译器会自动进行的类型转换,无需程序员显式指定。
- 场景:通常发生在将小范围(或低精度)类型转换为大范围(或高精度)类型时(称为宽化转换,Widening Conversion),因为这种转换通常是安全的,不会丢失信息。
- 特点:自动发生,保证数据完整性。
-
常见情况:
-
赋值:将一个小范围类型的值赋给一个大范围类型的变量。
byte b = 10; int i = b; // byte 自动提升为 int
-
算术运算:Java 有明确的算术提升规则。
- 对于
byte
,short
,char
类型,在参与大多数算术运算(如 +, -, *, /)时,它们会首先自动提升为int
类型,运算结果也是int
。 - 如果参与运算的操作数类型不同,编译器会按照
byte/short/char -> int -> long -> float -> double
的顺序,将低范围/精度的类型自动提升为高范围/精度的类型,运算结果与提升后的最高类型一致。int i = 1; double d = 2.0; double result = i + d; // i 先提升为 double (1.0),然后计算 1.0 + 2.0,结果是 double 类型 3.0
- 对于
-
扫描二维码,在手机上阅读
收藏