1.编译器的常量优化
在给变量进行赋值的时候,如果右侧的表达式当中全部是常量,没有任何变量,
例如:short num = 1 + 11; // 等号右边全都是常量,没有任何变量参与运算
那么编译器javac将会直接计算出右侧的运算结果,并赋给左侧变量。
编译之后,得到的class字节码中相当于如下的语句:
short num = 12; // 右侧的常量结果没有超过左侧定义的数值范围,所以正确。
注意:一旦右侧表达式中有变量参与,那么这种优化就不会进行了。
2.数据类型“隐式强制”转换
对于byte、short、char三种数据类型来说,初始化赋值时为:
byte b1 = 1;
short s2 = 2;
char c3 = 3;
此时,右侧本质上是一个int,
而将一个int赋值给byte、short、char时,应该进行强制类型转换,如
byte b1 = (byte) 1;
short s2 = (short) 2;
char c3 = (char) 3;
但是在定义这三种类型时,我们一般采用前者,而不采用后者。
一方面是因为前者书写量少,
另一方面是因为对于byte、short、char三种类型来说,定义时当右侧数值没有超过范围,那么javac编译器会自动隐含的帮我们补上(byte)、(short)、(char)
注意:1. 右侧的数值未超过左侧的范围时,编译器自动补上强转。
2. 右侧的数值超过了左侧的范围时,编译器直接报错。
网友评论