当数据类型不一样时,将会发生数据类型转换。
- 数据类型转换分为两种:自动类型转换(隐式) 和 强制数据类型转换(显式)
自动类型转换:
(1)代码不需要进行特殊处理,自动完成。
(2)规则:数据范围从小到大。
强制类型转换:
(1)代码需要进行特殊的格式处理,不能自动完成。
(2)格式:范围小的类型 范围小的变量 = (范围小的类型) 原本范围大的数据 eg: int num = (int)100L;
case1![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/29751cb11407360168a89bd6e14ecc5c.png)
原因:
-
对于byte,short,char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char)。一旦右侧赋值数值超过了左侧的范围,那么编译器直接报错。
-
如果右侧的表达式含有变量,则需要手动强制类型转换。否则会报错。
eg:
package Test;
public class Test {
public static void main(String[] args) {
short a = 5;
short b = 8;
short result1 =(short)( a + b);
}
}
case2
原因:在给变量赋值时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。编译之后得到的 . class字节码文件当中就相当于直接就是:short result2 = 13;右侧的常量结果数值没有超过左侧范围,所以正确。这称为“编译器的常量优化”。
面试题:
解析:显而易见,这道题考查到了基本数据类型转化和final关键字的使用这方面的知识。
从上面讲述的内容我们可以知道如果右侧的表达式含有变量,则需要手动强制类型转换。否则会报错。所以上面代码片段中语句 “ b3 = (b1 + b2) ; ”会出现编译出错。所以可知选项C正确。
那么你会不会好奇为什么语句“ b6 = b4 + b5 ;”不会发生编译错误呢?
因为b4 ,b5都是被final修饰的,我们都知道final在声明了变量之后,就不可以再改变该变量的值。即b4 , b5,的值分别始终都是byte类型的4,6。而b6就是byte类型的所以在“=”两边不存在数据类型不一致的问题,所以编译器不会报错。