Java自动和强制类型转换
自动类型转换
可以直接将一个小的数据类型直接赋值给大的数据类型。(自动类型转换)
int a=100,b;
byte c=100,d;
b=c;//自动类型转换,小的数据类型可以直接赋值给大的数据类型
// d=a;//报错,一个大的数据类型直接赋值给小的数据类型,不能直接转换
强制类型转换
不能(直接)把一个大的数据类型直接赋值给小的数据类型 。比如int32位,byte8位。byte存不下32位,最大只能存8位,所以它只能截取8位存下,把int的剩余的部分丢弃。导致最终的数据不一致。就好比大桶水往小桶里面倒,小桶装不下,水会溢出一部分。但是可以间接的转换,即强制类型转换。但是存在精度丢失或溢出的问题,所以使用时要格外注意。
int a=100,b=400;
byte c,d,e;
// c=a; //报错,一个大的数据类型直接赋值给小的数据类型,不能直接转换
d=(byte)a;
e=(byte)b;
System.out.println(d);//100,精度未丢失
System.out.println(e);//-112,强制类型转换造成精度丢失。
自动类型提升
当一个算术表达式中包含多个基本数据类型(boolean除外)的值时,整个算术表达式的数据类型将在数据运算时出现类型自动提升。所有的byte、short、char类型被自动提升到int类型,整个表达式的最终结果的类型被提升到表达式中类型最高的类型。
浮点类型默认是double类型,后缀带f的才是float类型。
// float f = 1.1;//报错,默认是double类型,不能向下转型。
float f = 1.1f;//1.1f 字⾯量才是 float 类型。
//float e=f+1.1;//报错,1.1默认是double类型,f是float类型。
//最终结果的类型被提升到表达式中类型最高的类型,即double类型,double类型不能自动向下转型为float
整数类型默认是int类型,没有声明(运算)的整数类型都是int类型。声明了则为声明的数据类型。运算中所有的byte、short、char类型被自动提升到int类型
short s1 = 1,s2=2;
//short s3=s1+s2; //报错,s1+s2自动提升为int类型,int类型不能自动向下转型为short
但是使⽤ += 或者 ++ 等等运算符,会执⾏隐式强制类型转换。
s1 += 1;
s1++;
//上⾯的语句相当于 s1 = (short) (s1 + 1);隐式强制类型转换