目录
一、类型转换
1.1 自动类型转换(隐式)
1.1.1 int 与 long 之间
1.1.2 float 与 double 之间
1.1.3 int 与 byte 之间
1.2 强制类型转换(显示)
1.2.1 int 与 long 之间
1.2.2 float 与 double 之间
1.2.3 int 与 double 之间
1.2.4 int 与 byte 之间
二、类型提升
2.1 int 与 long 之间
2.2 byte 与 byte 之间
Java作为一个强类型的编程语言,当不同类型进行相互赋值的时候,会有严格的校验。
就比如下面这几行代码。
int a = 10 ;long b = 100L ;b = a ; // 可以通过编译a = b ; // 编译失败
一、类型转换
1.1 自动类型转换(隐式)
自动类型转换:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
特点:数据范围小的转为数据范围大的时自动进行。
1.1.1 int 与 long 之间
int a = 100;
long b = 10L;
b = a;
a = b;
如上代码中:将a赋值给b的时候,编译会通过,因为a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值。
将b赋值给a的时候,编译失败,因为long的范围比int范围大,会有数据丢失,不安全。
1.1.2 float 与 double 之间
float f = 3.14F;
double d = 5.12;
d = f;
f = d;
如上代码中:同理在将 f 赋值给 d 的时候,编译器会将 f 转换为double类型,然后进行赋值。
将 d 赋值给 f 的时候,编译不能通过,double表示数据范围大,直接将float交给double会有数据丢失,不安全。
1.1.3 int 与 byte 之间
byte b1 = 100;
byte b2 = 257;
我们在写代码的时候,写出来的整数,编译器默认都是int类型。
如上代码中, 第一行编译通过,虽然100默认是int类型,但是100没有超过byte的范围,编译器隐式将100转换为byte。
第二行编译失败,257超过了byte的数据范围(-128,127),有数据丢失。
1.2 强制类型转换(显示)
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。 特点:数据范围大的到数据范围小的。但是可能会造数据丢失。
1.2.1 int 与 long 之间
int a = 10;
long b = 100L;
a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败
如上代码中:我们将长整型变量b赋值给a的时候,需要进行强制类型转换,否则会编译失败
格式:a = (int)b;
1.2.2 float 与 double 之间
float f = 3.14F;
double d = 5.12;
f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
在将double类型变量b赋值给float类型变量时,数据由大到小,所以也需要强制类型转换
格式:f = (float)d;
1.2.3 int 与 double 之间
int a = 10;
double d = 5.12;
a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃
如上代码中,如果直接将double型变量d赋值给整型和变量a编译不会通过,因为类型不兼容,不是属于同一类基本数据类型。所以也需要进行强制类型转换,但是转换之后,小数点之后全部丢弃。
1.2.4 int 与 byte 之间
byte b1 = 100;
byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错
如上代码中,第一行代码中,100默认为int,但是没有超过byte的范围,所以编译器会自动隐式转换,在第二行代码中,257超过了byte的范围,所以需要进行强制类型转换,否则就会报错,但是这里强转之后数据会丢失。
boolean flag = true;
a = flag; // 编译失败:类型不兼容
flag = a; // 编译失败:类型不兼容
如上代码中,编译也是不会通过的,因为a和flag是两个不相干的类型,完全一点管理,所以不能进行赋值,也不能进行强转类型不兼容。
注意:
①不同数字类型的变量之间赋值 , 表示范围更小的类型能隐式转换成范围较大的类型② 如果需要把范围大的类型赋值给范围小的 , 需要强制类型转换 , 但是 可能精度丢失③ 将一个字面值常量进行赋值的时候 , Java 会自动针对数字范围进行检查④ 强制类型转换不一定能成功,不相干的类型不能互相转换
二、类型提升
类型提升:不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的
2.1 int 与 long 之间
int 会被提升为 long
int a = 10;
long b = 20;
int c = a + b; // 编译出错: a + b==》int + long--> long + long 赋值给int时会丢失数据
long d = a + b; // 编译成功:a + b==>int + long--->long + long 赋值给long
如上代码,第三行会编译出错,因为int型和long型进行运算的时候,int型会被类型提升为long型,再与然后在进行运算,最后结果为long型,所以将long型赋值给int型c的时候会丢失数据。
2.2 byte 与 byte 之间
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
如上代码,编译也会出错,因为所有小于四个字节的数据类型,在运算的时候会被提升为int类型在进行运算,所以a+b的结果为int型。
正确写法:
byte a = 10 ;byte b = 20 ;byte c = ( byte )( a + b );
结论:
byte 和 byte 都是相同类型 , 但是出现编译报错 . 原因是 , 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算 , 得到的结果也是 int, 这是赋给 c, 就会出现上述错误 .由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据 . 为了硬件上实现方便 , 诸如 byte 和 short 这种低于 4 个字节的类型 , 会先提升成 int, 再参与计算。