类型转换
原理
由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
低------------------------------------------------------------------------------------------->高
byte,short,char ------> int -----> long ------> float ------->double
这些都能进行混合运算。
但是,运算中,不同类型的数据需要先转换为同一类型,然后进行运算。
上述的低到高代表容量。并且小数的优先级大于整数。
问题导入
package com.company;
public class Demon04 {
public static void main(String[] args){
int i=128;
byte b=i;//将i的值赋给b
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9j8bNSG8-1630504515113)(D:\JAVA学习图片\java类型转换\Java类型转换01.png)]
但是根据报错发现,b需要byte类型但是给b的是int类型。
所以我们需要把i转换成int类型。
如何进行类型转换呢?
//在这个变量的前面加上一个括号中间写需要转换的类型就可以了
public class Demon04 {
public static void main(String[] args){
int i=128;
byte b=(byte) i;
//在这个变量的前面加上一个括号中间写需要转换的类型就ok了
System.out.println(b);
System.out.println(i);
}
}
强制类型转换
强制转换:(类型)变量名 由高字节范围到高字节范围的数据类型的转换。
内存溢出
运行上面的代码发现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4XOTrN0X-1630504515116)(D:\JAVA学习图片\java类型转换\Java类型转换02.png)]
输出的b=-128与i不相等。
原因是因为byte类型最大值为127
而给byte的类型赋值128就有了一个内存溢出的问题。
内存溢出数就会完全变样子了。
自动类型转换
自动转换:不需要操作 由低字节范围到高字节范围的数据类型的转换。
package com.company;
public class Demon04 {
public static void main(String[] args){
int i=128;
double b=i;
System.out.println(b);
System.out.println(i);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIUEOyWu-1630504515117)(D:\JAVA学习图片\java类型转换\Java类型转换03.png)]
所以由低字节范围到高字节范围的数据类型的转换不需要任何操作
注意点
-
不能对布尔值(boolean)进行转换
-
不能把对象类型转换为不相干的类型
-
在把高容量转换到低容量时是强制转换,转换的时候可能遇见内存溢出以及精度问题。
如图
public class Demon04 { public static void main(String[] args){ double b=37.3; int i=(int)b; System.out.println(b); System.out.println(i); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWMGMoZ4-1630504515119)(D:\JAVA学习图片\java类型转换\Java类型转换04.png)]
操作比较大的数时,注意溢出问题。
JDK7新特性:数字之间可以用下划线分割。下滑线并不会被显示。
public class Demon04 {
public static void main(String[] args){
int money=10_0000_0000;
System.out.println(money);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wcDkXlc-1630504515121)(D:\JAVA学习图片\java类型转换\Java类型转换05.png)]
public class Demon04 {
public static void main(String[] args){
int money=10_0000_0000;
int years=20;
int total=money*years;
System.out.println(total);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4p2p2kqj-1630504515123)(D:\JAVA学习图片\java类型转换\java类型转换06.png)]
计算的时候溢出了
换成long类型
public class Demon04 {
public static void main(String[] args){
int money=10_0000_0000;
int years=20;
int total=money*years;
long total2=money*years;
System.out.println(total);
System.out.println(total2);
/*money与years默认是int所以计算后的也是int型之后再转换成long型转换之前以及出错了*/
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iyDU3OoK-1630504515124)(D:\JAVA学习图片\java类型转换\java类型转换07.png)]
money与years默认是int所以计算后的也是int型之后再转换成long型转换之前以及出错了
那么需要如何操作呢?
先把其中一个数换成long类型就行了
public class Demon04 {
public static void main(String[] args){
int money=10_0000_0000;
int years=20;
long total3=money*((long)years);
System.out.println(total3);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZaB90aEp-1630504515124)(D:\JAVA学习图片\java类型转换\Java类型转换08.png)]
小知识
一个数后加L也会是long型的。