五、Java 数据类型转换

我们之前的代码中,为变量赋值时,要求数据值需要和变量的数据类型相同,但这真的是必须的吗?

让我们考虑一种情况,在数学中,我们知道 1 = 1.0 ,那么我们是否能够使用 double 类型的变量,存储数字 1 呢?

public class Hello {
    public static void main(String[] args) {
        double n = 1;
        System.out.println("n = " + n);
    }
}

运行后,我们可以得到输出结果:n = 1.0 。

从这个例子,我们可以看出,数据的类型并非一成不变,字面量 1 就从 int 变为 double 了。

数据类型的转换可以分为隐式转换(自动类型转换)显式转换(强制类型转换)两种。

1 隐式转换(自动类型转换)

上面的例子,就是一种隐式转换,因为我们没有刻意做什么,转换就发生了。

如果以下 2 个条件都满足,那么将一种类型的数据赋给另外一种类型变量的时,将执行自动类型转换(automatic type conversion)。

  • 两种数据类型彼此兼容

  • 目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)

在我们已经学过的数据类型中,隐式转换规则如下:

  • 数值型数据的转换:byte→short→int→long→float→double。

  • 字符型转换为整型:char→int。

2 显式转换(强制类型转换)

有时候,我们必须逆隐式转换的顺序进行转换

比如,我们去买东西,应付 2.01 元,这时,商家往往会 “抹零” ,实付 2 元。抹零的操作,在代码中,我们能够写成这样:

public class Hello {
    public static void main(String[] args) {
        int n = 2.1;
        System.out.println("n = " + n);
    }
}

但这样写,我们会得到报错:需要类型为 int ,但提供的类型为 double 。

这说明,这种转换不能自动发生,我们需要显式进行转换。即:在需要被转换的数据前,用括号明确指出希望转换成的数据类型

正确代码如下:

public class Hello {
    public static void main(String[] args) {
        int n = (int)2.1;
        System.out.println("n = " + n);
    }
}

输出:n = 2