秦疆的JavaSE课程笔记:25 基础 类型转换
- 由于Java是强类型语言,在某些运算时会需要类型转换。
- 数据类型容量由低到高分别为:
byte
&short
&char
<int
<long
<float
<double
(浮点数的优先级大于整数) - 运算中,不同类型的数据先转换为同一类型,再进行计算。
- 高容量类型到低容量类型需进行强制转换。
- 低容量类型到高容量类型会自动转换。
1、强制转换
public class Demo1 {
public static void main(String[] args) {
//强制类型转换 高到低
int i = 128;
byte b = (byte)i;//将高容量量int强制转换为低容量byte
System.out.println(i);
System.out.println(b);
}
}
输出结果为:
128
-128
byte
的取值范围为-128-127,发生了内存溢出。- 转换时要注意避免内存溢出!!
2、自动转换
public class Demo2 {
public static void main(String[] args) {
//自动类型转换 低到高
int c = 128;
double d = c;//将低容量int转换为高容量double,不要需要任何指令
System.out.println(c);
System.out.println(d);
}
}
输出结果为:
128
128.0
- 不能对
boolean
值进行转换。 - 不能把对象类型转换为不相干的类型。
- 转换时可能存在内存溢出,或精度问题。
3、精度损失
public class Demo3 {
public static void main(String[] args) {
//精度损失
System.out.println((int)3.1415926);
System.out.println((int)-114.514F);
}
}
输出结果为:
3
-114
- 因为是把小数转换为了整数,舍弃了所有小数位(不是四舍五入,是直接舍弃)
4、字符转换
public class Demo4 {
public static void main(String[] args) {
//字符转换
char e = 'A';
int f = e+1;
System.out.println(f);
System.out.println((char)f);
}
}
输出结果为:
66
B
char
的本质是数字,所以+1
这一步相当于自动转换为了高容量的int
类型。- 此后再将
int
强制转换为char
,根据Unicode的编码顺序,字母A后面一个字符就成了字母B。
5、溢出问题
public class Demo5 {
public static void main(String[] args) {
//溢出问题
int money = 10_0000_0000;//JDK7开始的特性,数字间加"_"分位,不影响代码执行
int years = 20;
int total1 = money*years;
System.out.println(total1);//内存溢出
long total2 = money*years;
System.out.println(total2);//内存溢出,不解决问题
long total3 = money*((long)years);
System.out.println(total2);//不再溢出
}
}
输出结果为:
-1474836480
-1474836480
20000000000
-
计算大数据的时候要注意溢出问题。
-
long total2
的问题在于,money*years
是int
数据,计算完成时已经数据溢出,再转换为long
于事无补。 -
((long)years)
会将数据强制转换为long
,再乘以money
,计算结果依旧会是long
类型数据,所以不再溢出。 -
long
类型数据末尾要加L
,虽然大小写都可以,但为了避免读写失误,尽量使用大写而不用小写。