Java中的类型转换
场景:使用等号进行赋值,左右两边的类型不一致
1、隐式类型转换(自动类型转换)
如果左边的类型能够兼容右边的类型,系统将自动进行隐式转换,通俗来说就是左边大,右边小。
1)如果左右都是整型数,长度越大的,单位就越大。
long>int>short>byte
2)如果两边都是浮点数,左边是double、右边是float可以隐式提升。
3)如果一边是整型,一边是浮点型,左边浮点型,右边整型可以进行隐式提升。
注意:浮点型总是要大于整型的
4)涉及到char类型的转换
char是一个无符号数,所以它在和有符号数进行相互转换时,不能单纯的看字节长度。
- 左边char,右边byte,即便左大右小,但是也不能进行隐式转换,因为byte中存在char类型无法表示出的数值。
- 一边是char类型,一边是short类型;两边的范围等长,也不能进行隐式转换。
小结:char和(byte及short)之间都不能相互进行转换。
- 右边是char,左边是int或比int更大的单位,都可以进行隐式转换,例如:int、long、float、double。
2、显示类型转换(强制类型转换)
- 概述:当数据左右两边的兼容性不足以满足隐式转换条件时,如果仍需要转换,就可以使用强转语法。
- 语法:(数据类型)变量/常量
- 注意:强制类型转换有可能会发生精度丢失问题
强制类型转换一般发生在从大单位转小单位的场景中
从大到小强转的本质是:舍掉多余的、小单位表示不出来的二进制位(放不下的位数)
原则:舍弃高位,保留低位
思考:为什么是舍弃高位,保留的低位?
只有在保留低位的情况下,才有可能保证数值不变;若舍弃高位则有可能舍弃掉真实的数值。
注意:舍弃掉的高位中一定包含原本的符号位;
剩余低位中的首位,会变成新的符号位;
有可能会对数值的正负产生影响;
小结:不是所有的强转都一定会发生精度丢失,要看这个数值在目标类型中是否可以表示出来。
例如:现在要将A类型的数值强转为B类型,这个A类型的数值如果本身在B类型中就可以表示出来,那么强转之后数值大小不变。
案例:
面试题: