布尔型变量:这个类型只有true和false的赋值
C语言中0为假非0为真,但是在JAVA中当我们对boolean进行赋值1时会进行报错他会对1识别为整形,boolean只有两个值true和false。
在JAVA虚拟机规范中没有明确boolean的占几个字节,也没有专门处理boolean的字节码指令
数据类型来定义变量 数据类型——》变量
此时我们思考一下不同的类型之间有什么关系?这样我们就引出了一个新的概念强制类型转换
强制类型转换:
当我们定义一个整形变量int a =10;一个长整型变量 long b = 20L;的时候再对a赋值b此时会产生报错,这里为什么会产生错误呢?
因为我们定义的左边的a是一个int类型占4字节 ,右边的b是一个long类型占8字节当我们想要把一个8字节的b赋值给4字节的a时就会产生报错 。
那么此时我们应该怎么去做让b赋值给a呢?我们应该使用强制类型转换
在这里我们对b使用强制类型转换在b的前面加上(int)将long类型转换为int型。
但是强制类型转换不一定是安全的 :因为在long类型转换为int类型时有4个字节的数据丢失了所以强制类型转换可能会使数据丢失造成不安全。
但让我们来看这样的一串代码
两边变量都是4个字节为什么不能进行赋值?
我们想想float类型存储的是小数表示的范围或者说宽度比int表示的整数更多。
例如在1-10中整数只有10个数但是在小数的范围内我们无法知道其中有多少。
那么在这里我们就需要强制类型转换
这里我们需要注意的就是进行强制类型转换之后我们丢失了小数部分,精度丢失了所以这里再次证明了强制类型转换可能会丢失数据。
那么我们再在常用的8个数据类型里我们想一想除了浮点数和整数我们还有boolean类型这个类型能发生强制转换吗?
从代码里看这里对boolean类型进行强制类型转换时是无法进行转换的,由此我们得出
结论:不相干的类型不能互相转换
这里我们还有显示类型转换什么意思呢?我们来看下面的代码
还是以这两个类型举例当int类型的a赋值给long类型的b时这里不会进行报错为什么呢这里就是显示类型转换了——当我们把范围小的类型赋值给范围大的类型的时候小的类型会转换为类型大的。这里是int类型转换为long类型然后对b进行赋值。
那么这里又引出了一个新的概念——类型提升
类型提升:不同类型的数据相互运算时,数据类型小的会被提升成数据类型大的
这里我们报错的原因的在运算的时候我们的b是long类型a是int类型在相加时a会类型提升为long类型但是long+long结果应该也是long类型的所以c应该是long类型才不会报错或者可以进行强制类型转换(承担精度丢失的风险但是此时里面的值完全可以承受)
那么再来看上面这个代码为什么报错呢?a和b明明都是byte类型且c的范围完全够接收a+b的值怎么会报错呢?
这里由于计算机的cpu通常是按照4个字节为单位从内存读写数据的对于short,byte这种比4个字节小的类型会先提升为4个字节再进行运算。
那么这个问题就好解决了
但是这里面我们又会提出一个问题数字不是默认为int类型吗?将int类型赋值给byte不会报错吗?
其实编译器会帮你检查如果字面值的范围是在自己表示的范围内,就不会报错的。
当你赋的值超出这个范围的时候就会进行报错。