【Java】显式转换和隐式转换

avatar

azurekiln

在 Java 中,不同数据类型之间可以进行转换,主要分为两种:

  1. 显式类型转换 (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)
  1. 隐式类型转换 (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

扫描二维码,在手机上阅读
收藏
请先 登录 再评论
powered by emlog pro
服务器供应商 景云数据

友情链接
白衣Ink


sitemap