隐式转换(自动类型转换)
如果满足以下两个条件,则将一种类型的数据赋给另一种类型的变量时,会自动进行类型转换。
- 两种类型的数据是相互兼容的
- 目标类型中的值的范围大于源数据中的类型(低级类型数据转换为高级类型数据)
当满足上述两个条件时,就会发生加宽转换(widening conversion)。例如,将byte类型转换为short类型时,由于short类型的取值范围较大,所以会自动转换为short类型。
运算时,不同的数据类型会转换为相同的数据类型,因此整型、浮点型、字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换为高级类型数据。转换规则为:
- 数值数据的转换:byte→short→int→long→float→double。
- 将字符类型转换为整数类型:char→int。
上述数据类型转换遵循从左到右的转换顺序,最终转换为表示表达式中变量最大范围的数据类型。
实施例1
一位顾客去超市购物,买了两盒牙膏和四盒纸巾。其中,牙膏的价格为10.9元,纸巾的价格为5.8元,因此求出产品的总价。实现代码如下。
public static void main(String[] args) {
float price1 = 10.9f; // 歯磨き粉の価格を定義
double price2 = 5.8; // ティッシュの価格を定義
int num1 = 2; // 歯磨き粉の数量を定義
int num2 = 4; // ティッシュの数量を定義
double res = price1 * num1 + price2 * num2; // 合計金額の計算
System.out.println("レジ係に支払う合計金額は" + res + "円です。"); // 合計金額を出力
} 上面的代码中,首先定义了一个float类型的变量来存储牙膏的价格,然后定义了一个double类型的变量来存储面巾纸的价格,最后定义了一个double类型的变量来存储面巾纸的数量。为此定义了两个 int 类型的变量。然后将结果存储在 double 类型的变量中以供输出。
查看执行结果,可以看到float、int、double三种数据类型参与运算,最终输出结果是double类型的数据。这种转换通常称为“表达式内的自动类型提升”。
自动类型提升固然很棒,但它也会导致令人困惑的编译错误。例如,下面的程序看起来不错,但它会导致问题。
byte b = 50;
b = b * 2; // Type mismatch: cannot convert from int to byte
如上图,第二行报“Typemismatch:Cannotconvertfrominttobyte”错误。
程序尝试将完全合法的字节值 50*2 存储到字节变量中。但是,当对表达式求值时,操作数会自动提升为 int 类型,计算结果也会提升为 int 类型。此类表达式的结果是 int 类型,并且不能在不进行强制转换的情况下分配给 byte 类型。事实上,在这种特殊情况下,分配的值仍然适合目标类型。
所以你必须使用像这样的显式强制转换:
byte b = 50;
b = (byte)(b*2);
这会产生正确的值 100。
注意:char 类型比较特殊;char 会自动转换为 int、long、float 和 double,但 byte 和 Short 不能自动转换为 char,并且 char 不能自动转换为 byte 或 Short。
显式转换(强制转换)
尽管自动类型转换很有用,但它并不能满足所有编程需求。例如,如果需要将 double 类型的值赋给 int 类型的变量该怎么办?
这种转换不会自动发生,因为 double 类型的范围小于 int 类型的范围。这种类型的转换有时称为“归约转换”,因为它涉及减少源数据类型的值以适合目标数据类型。
因此,如果两种数据类型不兼容,或者目标类型的取值范围小于源类型的取值范围,则无法进行自动转换,需要进行强制类型转换。其语法形式为:
(type)変数名 其中,type是variableName要转换的数据类型,variableName是要转换的变量的名称。强制转换的示例有:
int a = 3;
double b = 5.0;
a = (int)b;
int a = 3; // aに3を代入
double b = 5.0; // bに5.0を代入
a = (int)b; // bをint型にキャストして、aに代入 在上面的代码中,将 double 类型的变量 b 的值转换为 int 类型,然后赋值给 a,但变量 b 本身的值保持不变。
强制转换在将浮点值转换为整数时直接删除小数点右侧的数字,并在将整数类型强制转换为浮点类型时添加零。小数点后。
实施例2
一位顾客去超市购物,买了两盒牙膏和四盒纸巾。其中牙膏的价格为10.9元,纸巾的价格为5.8元。求出商品的总价,计算总价时使用int类型数据进行存储。实现代码如下。
public static void main(String[] args) {
float price1 = 10.9f;
double price2 = 5.8;
int num1 = 2;
int num2 = 4;
int res2 = (int) (price1 * num1 + price2 * num2);
System.out.println("Price:" + res2 + "円");
} 上面的例子中,double类型、float类型、int类型的数据参与运算,运算结果默认为double类型,而题目要求的结果是int类型,因为取值范围不同int类型的很小。由于是double类型,所以需要进行类型转换。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

