zhcn 编程语言 Java 非公開: Java数据类型转换:强制类型转换+自动类型转换

Java数据类型转换:强制类型转换+自动类型转换

当赋值的类型与变量接收的数据类型不一致时,就会发生数据类型转换,必须将一种类型的数据转换为另一种类型的数据。数据转换有两种类型:隐式转换(自动类型转换)和显式转换(强制类型转换)。

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

如果满足以下两个条件,则将一种类型的数据赋给另一种类型的变量时,会自动进行类型转换。

  • 两种类型的数据是相互兼容的
  • 目标类型中的值的范围大于源数据中的类型(低级类型数据转换为高级类型数据)

当满足上述两个条件时,就会发生加宽转换(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类型,所以需要进行类型转换。

《Java数据类型转换:必需类型转换+自动类型转换》浅显易懂讲解!您必须观看的 2 个最佳视频

初心者でも分かる基本データ型の型変換:自動とキャストの違いがスパッと分かる!【Java入門講座】2-7 基本データ型の型変換
https://www.youtube.com/watch?v=KDmJDC7U59c&pp=ygVCSmF2YeODh-ODvOOCv-OBruWei-WkieaPmzog5b-F6aCI5Z6L5aSJ5o-bICsg6Ieq5YuV5Z6L5aSJ5o-bJmhsPUpB
【Javaプログラミング入門 #7】データの型変換(自動型変換/キャスト など) ※1.5倍速での再生を推奨
https://www.youtube.com/watch?v=4XUFIu3F4Y0&pp=ygVCSmF2YeODh-ODvOOCv-OBruWei-WkieaPmzog5b-F6aCI5Z6L5aSJ5o-bICsg6Ieq5YuV5Z6L5aSJ5o-bJmhsPUpB
当赋值的类型与变量接收的数据类型不一致时,就会发生数据类型转换,必须将一种类型的数据转换为另一种类型的数据。数据转换有两种类型:隐式转换(自动类型转换)和显式转换(强制类型转换)。

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

如果满足以下两个条件,则将一种类型的数据赋给另一种类型的变量时,会自动进行类型转换。

  • 两种类型的数据是相互兼容的
  • 目标类型中的值的范围大于源数据中的类型(低级类型数据转换为高级类型数据)

当满足上述两个条件时,就会发生加宽转换(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类型,所以需要进行类型转换。

《Java数据类型转换:必需类型转换+自动类型转换》浅显易懂讲解!您必须观看的 2 个最佳视频

初心者でも分かる基本データ型の型変換:自動とキャストの違いがスパッと分かる!【Java入門講座】2-7 基本データ型の型変換
https://www.youtube.com/watch?v=KDmJDC7U59c&pp=ygVCSmF2YeODh-ODvOOCv-OBruWei-WkieaPmzog5b-F6aCI5Z6L5aSJ5o-bICsg6Ieq5YuV5Z6L5aSJ5o-bJmhsPUpB
【Javaプログラミング入門 #7】データの型変換(自動型変換/キャスト など) ※1.5倍速での再生を推奨
https://www.youtube.com/watch?v=4XUFIu3F4Y0&pp=ygVCSmF2YeODh-ODvOOCv-OBruWei-WkieaPmzog5b-F6aCI5Z6L5aSJ5o-bICsg6Ieq5YuV5Z6L5aSJ5o-bJmhsPUpB