2.4 基本数据类型之间的转换
在程序的编写过程中,许多情况下都需要把一种数据类型的值转换为另一种不同数据类型的值。这时就会涉及两种不同数据类型之间的转换。Java语言有两种数据类型转换方式:自动类型转换和强制类型转换。
2.4.1 自动转换类型
自动类型转换又叫隐性类型转换。在运算时不需要由用户指定目标数据类型,系统自己进行类型转换。自动类型转换必须同时满足下面两个条件。
· 两种类型互相兼容。
· 目标数据类型值的范围大于被转换数据类型值的范围。
例如,把byte型变量值赋给一个int型变量。因为int型变量值的范围大于byte型变量的范围,这种情况下就会产生自动类型转换。自动类型转换示例程序的编写方法和代码如下所示。
(1)新建一个文本文档,用记事本程序打开该文档并输入下面的程序。
1 //代码实现 2 public class Sample2_16 3 { 4 public static void main(String[] args) 5 { 6 //定义变量 7 byte a; 8 int b; 9 short c; 10 long d; 11 float e; 12 double f; 13 14 //对变量进行赋值 15 a = 100; 16 b = a; 17 c = a; 18 d = a; 19 e = a; 20 f = a; 21 //输出 22 System.out.println("b的值为:" + b); 23 System.out.println("c的值为:" + c); 24 System.out.println("d的值为:" + d); 25 System.out.println("e的值为:" + e); 26 System.out.println("f的值为:" + f); 27 } 28 }
(2)单击“文件”|“保存”命令,保存这个文件。并把文件重命名为Sample2_16.java。
(3)打开命令提示符窗口,然后输入下面的命令并按“Enter”键编译程序。
javac Sample2_16.java
(4)输入下面的命令,运行这个程序。
java Sample2_16
(5)程序的运行结果如图2-16所示。
图2-16 Sample2_16的编译运行结果
上面的程序是把byte型变量赋给int、short、long、float、double类型的兼容情况。接下来再看一个示例程序,把int型变量的值赋给byte型变量。程序的编写方法和步骤如下所示。
(1)新建一个文本文档,用记事本程序打开该文档并输入下面的程序。
1 // 代码实现 2 public class Sample2_17 3 { 4 public static void main(String[] args) 5 { 6 //定义一个int型变量a 7 int a; 8 //定义一个byte型变量b 9 byte b; 10 //把100赋给变量a 11 a = 100; 12 //把变量a的值赋给变量b 13 b = a; 14 //输出b的值 15 System.out.print(b); 16 } 17 }
(2)单击“文件”|“保存”命令,保存这个文件。并把文件重命名为Sample2_17.java。
(3)打开命令提示符窗口,然后输入下面的命令并按“Enter”键编译程序。
javac Sample2_17.java
进行编译时就会报错。这是因为int型表示的值范围超出了byte型的值范围,系统不能自动进行类型转换所致。这种情况就需要用到强制类型转换了,如图2-17所示。
图2-17 Sample2_17的编译运行结果
2.4.2 强制转换类型
强制类型转换也叫显式类型转换。虽然自动类型转换在实际的编程过程中非常有用,但是很多情况下,都需要进行两个不兼容类型之间的转换,这时就要用到强制类型转换。
例如,把int型变量的值赋给一个byte型变量。这种转换是不会自动进行的,编译时就会报错。这时需要将int类型的值变小才能够适合目标数据类型——byte型,这样就要用到强制类型转换。强制类型转换的用法如下所示。
(目标数据类型)value
通过强制类型转换,可以把指定的值转换为目标数据类型。接下来通过一个具体的例子来演示强制类型转换的用法。示例程序的编写方法和步骤如下所示。
(1)新建一个文本文档,用记事本程序打开该文档并输入下面的程序。
1 // 代码实现 2 public class Sample2_18 3 { 4 public static void main(String[] args) 5 { 6 //定义一个整型变量a 7 int a; 8 //定义一个byte型变量b 9 byte b; 10 //把300赋给a 11 a = 300; 12 //把整型变量a的值强制转换为byte型 13 b = (byte)a; 14 System.out.print(b); 15 } 16 }
(2)单击“文件”|“保存”命令,保存这个文件。并把文件重命名为Sample2_18.java。
(3)打开命令提示符窗口,然后输入下面的命令并按“Enter”键编译程序。
javac Sample2_18.java
(4)输入下面的命令,运行这个程序。
java Sample2_18
(5)程序的运行结果如图2-18所示。
图2-18 Sample2_18的编译运行结果
当int类型转换为byte类型时,转换后结果为int类型变量的值与byte类型值的变化范围取模(即相除得到的余数)。byte类型的变化范围是256。300除以256的余数为44,所以上面例子的执行结果为44。
当浮点型转换为int型时,会舍掉小数部分。当浮点型太大以致超过int型的范围时,结果也是对int型的变化范围取模。浮点型转换为int型的程序编写方法和步骤如下所示。
(1)新建一个文本文档,用记事本程序打开该文档并输入下面的程序。
1 // 代码实现 2 public class Sample2_19 3 { 4 public static void main(String[] args) 5 { 6 int i; 7 int j; 8 double d; 9 float f; 10 d = 15.145236895f; 11 f = 1.354f; 12 //把d强制转换为int型 13 i = (int) d; 14 //把f强制转换为int型 15 j = (int) f; 16 System.out.println("把d强制转换为int型后值为:" + i); 17 System.out.println("把f强制转换为int型后值为:" + j); 18 } 19 }
(2)单击“文件”|“保存”命令,保存这个文件。并把文件重命名为Sample2_19.java。
(3)打开命令提示符窗口,然后输入下面的命令并按“Enter”键编译程序。
javac Sample2_19.java
(4)输入下面的命令,运行这个程序。
java Sample2_19
(5)程序的运行结果如图2-19所示。
图2-19 Sample2_19的编译运行结果
浮点型转换为byte型时,结果是舍掉小数部分后与byte类型变化范围取模。示例程序的编写方法和步骤如下所示。
(1)新建一个文本文档,用记事本程序打开该文档并输入下面的程序。
1 // 代码实现 2 public class Sample2_20 3 { 4 public static void main(String[] args) 5 { 6 int i; 7 byte b; 8 double d; 9 i = 300; 10 d = 270.134354545; 11 //把int型变量的值强制转换为byte型 12 b = (byte)i; 13 System.out.println("把i强制转换为byte型后值为:" + b); 14 //把double型变量的值强制转换为byte型 15 b = (byte)d; 16 System.out.println("把d强制转换为byte型后值为:" + b); 17 //把double型变量的值强制转换为int型 18 i = (int)d; 19 System.out.println("把d强制转换为int型后值为:" + i); 20 } 21 }
(2)单击“文件”|“保存”命令,保存这个文件。并把文件重命名为Sample2_20.java。
(3)打开命令提示符窗口,然后输入下面的命令并按“Enter”键编译程序。
javac Sample2_20.java
(4)输入下面的命令,运行这个程序。
java Sample2_20
(5)程序的运行结果如图2-20所示。
图2-20 Sample2_20的编译运行结果