1.自动类型转换
也称隐式类型转换,是指两种数据类型在转换的过程中不需要显式声明,由编译器自动完成。完成此转换必须同时满足两个条件:一是两种数据类型彼此兼容;二是目标类型的取值范围大于源类型的取值范围。例如:
byte b=3;
int x=b;
除了以上,还有很多类型之间可以进行自动类型转换。例如:
(1)整数类型之间可以实现转换。例如,byte类型的数据可以赋值给short、int、long类型的变量;short、char类型的数据可以赋值给int、long类型的变量;int类型的数据可以赋值给long类型的变量。
(2)整数类型转换为float类型。例如,byte、char、short、int类型的数据可以赋值给float类型的变量。
(3)其他类型转换为double类型。例如,byte、char、short、int、long、float类型的数据可以赋值给double类型的变量。
2.强制类型转换
当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要强制类型转换。例如:
public class Example{
public static void main(String[] args){
int nnum=4;
byte b=num;
System.out.println(b);
}
}
/**程序报错,将一个int型的值赋给byte类型的变量b时,
由于int类型的取值范围大于byte类型的取值范围,
这样的赋值会导致数值溢出 ———— 一个字节的变量无法存储4个字节的整数值。**/
此情况需进行强制类型转换:将int类型的值赋值给byte类型的变量。
#目标类型 变量=(目标变量)值
byte b=(byte)num;
运行结果为4;
值得注意的是,在对变量进行强制类型转换时,如果将取值范围较大的数据类型强制转换为取值范围较小的数据类型(int类型的数转换为byte类型),极易造成数据精度丢失。例:
public class Example01{
public static void main (String[] args){
byte a; //定义byte类型的变量a
int b=298; //定义int类型的变量b
a=(byte)b;
System.out.println("b="+b);
System.out.println("a="+a);
}
}
运行结果为
b=298
a=42
Tips:表达式类型自动提升
表达式是指由变量和运算符组成的算式。变量在表达式中进行运算时,可能发生自动类型转换,这就是表达式数据类型的自动提升。(一个byte类型的变量在运算期间会自动提升为int类型。)例:
public class Example02{
public static void main (String[] args){
byte b1=3; //定义一个byte类型的变量
byte b2=4;
byte b3=b1+b2; //两个byte类型变量相加,赋值给一个byte类型变量
System.out.println("b3="+b3);
}
}
/**程序报错,在表达式b1+b2运算期间,
变量b1和b2会被自动提升为int类型,表达式的运算就成了int类型。
这时,将结果赋给byte类型的变量,编译器报错。**/
解决方法:进行强制类型转换。——修改第五行代码:
byte b3=(byte) (b1+b2);