当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这就是自动类型转换。
int a = 'c';//char类型强制转换为int型,正确 double b = 10;//int类型强制转换为double型,正确
1.有多种类型的数据混合运算时,系统首先自动将所有数据转换成表达式中精度(容量)最大的那种数据类型,如果只有byte,short和char,那么所有值将被提升为int,然后再进行计算。
如果有一个操作数为long型,计算结果为long型。有一个操作数是float型,计算结果为float型。有一个操作数是double型,计算结果为double型。其余全为int型。
float d1 = 10 + 1.1;//10是int类型,1.1是double类型(默认),因此右边是double类型
正确写法:
float d1 = 10 + 1.1F;
2.当我们把精度大的数据类型赋值给精度小的数据类型时,会报错,反之进行自动类型转换。
int n2 = 1.1;//错误,double类型不能转换为int类型
但是下面讨论一个问题——byte的赋值:
byte b1 = 10;
这种写法是正确的,但是10不应该是int类型吗?实际上,当把具体数赋给byte时,首先判断该数是否在byte范围内,如果是就可以赋值,然后才看的数据类型。
int n2 = 1; byte b2 = n2;
但是对于这种写法就会报错,因为n2是一个变量,已经分配了4字节的空间,无法转换为1字节的byte,如果是一个变量,则直接判断数据类型。
3.byte和char之间,以及short和char之间不会相互自动转换。
byte b1 = 10; char c1 = b1;//错误
4.byte,short,char三者可以计算,在计算时首先转换为int类型。
注意即使是byte+byte(char+char等同理)最后也是int类型。
byte b1 = 10; short s1 = 20; char c1 = 30; int t1 = b1 + s1 +c1;//正确,结果为60
byte b1 = 10; byte b2 = 20; byte b3 = b1 + b2;//错误,b1+b2的结果是int类型
5.boolean不参与转换。
boolean pass = true; int num = pass;
6.自动提升原则:表达式结果的类型自动提升为操作数中精度最大的类型。
byte b1 = 1; short s1 = 2; int t1 = 3; char c1 = 20; double d1 = b1 + s1 + t1 +c1;//正确,结果为26.0(一定带小数点)
7. 复合赋值运算符会进行类型转换
byte a = 3; a += 6;//虽然6是int类型,但是使用 += 号会进行自动转换 System.out.println(a);//输出结果为9
byte a = 3; a = a + 6;//这样就不能进行类型转换了 System.out.println(a);
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),可能造成精度 降低或溢出。
public static void main(String[] args){ int i = (int)1.9;//精度降低 int j = 2000; byte b1 = (byte)j;//精度溢出 System.out.println(i); System.out.print(b1); }
1.强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级。
int x = (int)10*3.5 + 6*1.5;//错误,右边还是double类型 int y = (int)(10*3.5 + 6*1.5);//正确,右边先计算,再强转为int类型
2.char类型可以保存int的常量值,但不能保存int的变量值,需要强转。
char c1 = 100;//正确 int n = 100; char c2 = n;//错误,n为int变量值 char c3 = (char)n;//正确,n强转为char类型