在Java中,常量和变量的计算其实是存在差异的,二者的差异往往被我们所忽略,为了更好的理解其中的差异,首先看一道面试题:
byte b1=3,b2=4,b; b = b1+b2; b = 3+4;
哪句是编译失败的呢?为什么呢?
再看一看下面的例子:
public class Demo1{ public static void main(String[] args){ byte a=2,b=3,c; c=2+3; c=a+b; } }
编译的结果:
为什呢?
常量计算时,先把结果计算出来,然后看是否在其所在的数据类型范围内,如果在就不报错。例如上例中2+3会先计算结果,得到5,而5在byte数据类型表示的范围内,所以不会报错。而变量在进行运算时,一般首先进行类型提升(提升到默认类型,整数的默认类型是int类型),而不是先计算,所以a+b其实是两个int类型在相加,然而题目中给它们定义的是byte类型,高的类型向低的类型转换,如果不强制转换,就会丢失精度,所以会报错。
解决本问题的方法可以将类型强转一下。
1 public class Demo2{ 2 3 public static void main(String[] args){ 4 5 byte a=2,b=3,c; 6 c=2+3; 7 c=(byte)(a+b); 8 } 9 10 }
重新编译通过: