📜  Java中的类型转换和示例

📅  最后修改于: 2020-02-14 12:39:20             🧑  作者: Mango

当您将一种数据类型的值分配给另一种数据类型时,这两种类型可能彼此不兼容。如果数据类型兼容,那么Java将自动执行称为自动类型转换的转换,如果不兼容,则需要将其显式转换,例如,将int值分配给long变量。

加宽或自动类型转换

当自动转换两种数据类型时,将进行加宽转换。这种情况发生在以下情况:

  • 两种数据类型兼容。
  • 当我们将较小数据类型的值分配给较大数据类型时。

例如,在Java中,数字数据类型彼此兼容,但是不支持从数字类型到char或boolean的自动转换。而且,char和boolean彼此不兼容。 例:

class Test
{
    public static void main(String[] args)
    {
        int i = 100;
        // 自动数据类型转换
        long l = i;
        // 自动数据类型转换
        float f = l;
        System.out.println("Int 值 "+i);
        System.out.println("Long 值 "+l);
        System.out.println("Float 值 "+f);
    }
}

输出:

Int 值 100
Long 值 100
Float 值 100.0

缩小或明确转换

如果要将较大的数据类型的值分配给较小的数据类型,则执行显式类型转换或缩小。

  • 这对于无法自动转换的不兼容数据类型很有用。
  • 在此,target-type目标类型将指定值转换为的所需类型。

字符和数字彼此不兼容。让我们看看何时尝试将一个转换为另一个。

//Java程序展示不兼容的类型转换
public class Test
{
  public static void main(String[] argv)
  {
    char ch = 'c';
    int num = 88;
    ch = num;
  }
}

错误:

7: error: incompatible types: possible lossy conversion from int to char
    ch = num;
         ^
1 error

如何进行显式转换?
例:

//Java程序展示显式转换
class Test
{
    public static void main(String[] args)
    {
        double d = 100.04;
        // 显式转换
        long l = (long)d;
        // 显示转换
        int i = (int)l;
        System.out.println("Double的值 "+d);
        // 小数部分丢失
        System.out.println("Long的值 "+l);
        // 小数部分丢失
        System.out.println("Int的值 "+i);
    }
}

输出:

Double的值 100.04
Long的值 100
Int的值 100

在将值分配给字节类型时,小数部分丢失并减少为256模(字节范围)。
例:

//Java程序,展示将int和double类型转换为byte
class Test
{
    public static void main(String args[])
    {
        byte b;
        int i = 257;
        double d = 323.142;
        System.out.println("将int类型转换为byte.");
        //i%256
        b = (byte) i;
        System.out.println("i = " + i + " b = " + b);
        System.out.println("\n将double类型转换为byte.");
        //d%256
        b = (byte) d;
        System.out.println("d = " + d + " b= " + b);
    }
}

输出:

将int类型转换为byte.
i = 257 b = 1
将double类型转换为byte.
d = 323.142 b = 67

表达式中的类型提升

在评估表达式时,中间值可能会超出操作数的范围,因此将提升表达式值。类型提升的一些条件是:

  1. 在评估表达式时,Java会自动将每个字节、short或char操作数提升为int。
  2. 如果一个操作数是long、float或double,则整个表达式将分别提升为long、float或double。

例:

//Java程序展示表达式中的类型提升
class Test
{
    public static void main(String args[])
    {
        byte b = 42;
        char c = 'a';
        short s = 1024;
        int i = 50000;
        float f = 5.67f;
        double d = .1234;
        // 表达式
        double result = (f * b) + (i / c) - (d * s);
        // 打印提升后计算的结果
        System.out.println("result = " + result);
    }
}

输出:

Result = 626.7784146484375

表达式中的显式类型转换

在评估表达式时,结果将自动更新为较大的操作数数据类型。但是,如果将结果存储在任何较小的数据类型中,则会产生编译时错误,因此我们需要对结果进行类型转换。
例:

//Java程序,展示将int类型转换成byte
class Test
{
    public static void main(String args[])
    {
        byte b = 50;
        // int类型转换成byte
        b = (byte)(b * 2);
        System.out.println(b);
    }
}

输出

100

注意:如果是单个操作数,则将结果转换为int,然后按照上面的示例进行相应的类型转换。