你理解的完全正确。那么我再详细的说一下我的理解。
byte b1 = 3;
byte b2 = 4;
byte b = b1 + b2;这行代码是要报错的。因为b1和b2是两个变量,JVM无法判断两个变量的值,更无法判断两个变量相加后是否超出byte范围,所以会报错。
byte b = 3 + 4;这句代码是不会报错的。因为Java有常量优化机制,意思就是说,这句代码在编译的时候,其实编译器已经把结果算出来是7了,然后判断,7是在byte的范围内的,所以直接把7赋值给了b,所以不会报错。
byte b = 127 + 1;这句代码是会报错的,理由一样,编译的时候先算出结果是128,超出了byte的范围,不能再赋给b了,所以报错。
int a = 3;
int b = 4;
int c = a + b;这句代码是不会报错的。因为int是系统默认的整数类型,即所有整数类型,如果没有指定是长整型,那就是默认int类型。虽然两个int类型的变量相加,算完之后一定还是int类型,如果超出int的范围,系统会把低32位有效数据保留,高于32的数据全部舍弃,因为系统认为这个结果就是一个int类型的数据。
其实说白了,int类型的随便算,系统是不会管你算出来结果有没有错的,虽然两个int之和超出int范围后不会报错,但是算出的结果是与我们想象的不一样的,你可以试一下。
byte就不一样了,它不是系统默认的整数类型,其实内存中是有byte常量池的,也就是-128~127之间的数其实是在一个常量池中存着的,就像上面的byte b = 3 + 4;系统会先算出了结果是7,然后发现常量池中有7这个数据,就不报错,直接赋值了。但是两个变量byte 相加是无法计算值是否在常量池中的,所以报错。
写的有点啰嗦,希望继续探讨。