一:强制类型转换
1.强制类型转换是指一般赋值时左右两边数据类型不一致时所做的处理(通常为大范围到小范围时)。
例如:long强转为int(大范围转小范围)
int a = (int)1000L;
但是,我们使用时一定要注意其中两种类型的,因为强制类型转换有时会造成精度损失或者数据溢出。
例1:long强制转换为int时
public class Main {
public static void main(String[] args) {
int a = (int)2200000000L;
System.out.println(a);
}
}
//输出结果为-2094967296
这是因为int类型所能承载的最大整数大约为21亿,当把22亿强制类型转换为int时,int的存储空间是不够的,这样就造成了数据溢出。
例2:double类型转换为int时
public class Main {
public static void main(String[] args) {
int a = (int)6.66;
System.out.println(a);
}
}
//输出结果为6
这个就很容易明白了,因为int类型是整数型,当double类型强制转换为int类型时小数点后的数据会被int忽略掉,只存储小数点前的数据。
基本数据类型都有如此多坑,那么当我们使用java封装类型的时候也一定要注意才行哦。
2.byte/short/char 这三种类型也都可以发生数学运算,例如加法“+”,需要注意的是这三种类型的变量在做运算的时候是先被转化为int类型然后在做运算,也就是说byte+byte得到的值是int类型的值。
public class Main {
public static void main(String[] args) {
short a = 3;
short b = 5;
int c = a+b;//此处a+b的类型为int型
System.out.println(c);
}
}
//输出结果为8
3.boolean类型不能发生数据类型转换。
二:编译器的常量优化
对于byte/short/char三中类型来说,如果右侧赋值没有超过范围,那么javac编译器将会自动隐含的为我们补上(byte)(short)(char)。注意:1.如果没超过左侧类型范围,编译器补上强转。2.如果右侧超过了左侧类型范围,那么编译报错。
在给变量进行赋值时,如果右侧的表达式中全为常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。如:
public class Main {
public static void main(String[] args) {
short result = 3+2;//等号右边为两个int类型的常量,没有变量参与运算。
/**
short a = 4;
如果是short result = 3+2+a;这时程序就会报错,编译器无法完成常量优化
**/
System.out.println(result);
}
}
这个程序在编译之后在.class文件中相当于直接就是short result = 5;需要注意的是一旦表达式中有变量参与,则编译器无法进行这种优化。
这个系列是我放下Java一年后回过头来重新温习一遍做的总结,这系列也是我对于我认为基础中比较容易忽略的细节所做的笔记。大家看到之后希望大佬们多多留言指出我的不足,点赞,如果能够点个关注那我直接为你远程祈福O(∩_∩)O哈哈~,祝大家事事顺心!!!