类型转换
自动类型转换
记住这样的一个图
意思就是左边的类型的值可以直接赋值给右边的类型。但是反过来就得用到强制转换。
强制类型转换
首先提醒一下强制类型转换只限于上图中的这些数据类型。强制转换会造成数据的丢失,具体的做法就是将这些数据准换成一个二进制的数据然后砍掉一部分数据的长度。比如把int类型的233转换成一个8位的byte类型会把前面的24位砍掉。然后看这个数据的首部来判断是否为负数,如果是负数那么这串数字就代表它的补码(负数在计算机中以补码的方式存储)这样的话我们要把它换算成源码。最后得到的byte的值为-23。
值的一提的就是小数在程序中默认是double型所以float f = 5.6会编译报错。
表达式的自动提升
一共有两条规则:
① 所有的byte类型,short类型,char类型将被提升到int类型。
② 算数表达式的数据类型会被提升到表达式内所存在的最高的数据类型。
如以下两行代码发生了编译错误
short sValue = 5; sValue = sValue + 2; |
直接量与常量池
直接量包括基本的数据类型的常量与String类型的直接量和null,null这个类型只有一个值那就是null。
String是一个不可变类型。当一个字符串第一次使用直接量的时候Java会直接使用常量池中的字符串直接量。那么说到是这里什么是常量池呢?就是在编译时被确定,并且保存在已经编译好的.class文件中的一些数据。具体来说就是有关类,方法,接口中的常量也包括字符串直接量。
这里需要强调的是Java会保证相同的字符串常量只有一个不会重复。而且一些字符串常量的拼接也会形成新的字符串常量。这样以下的代码就会输出true
String s1 = "hello"; String s2 = "hell" + "o"; System.out.println(s1 == s2); |
位运算符
这里只介绍以下<<与>>和>>>的区别与用法:
<<算数左移,低位补0,高位被裁。
>>算数右移,高位以符号位填充,低位被裁。
>>>无符号右移,高位以0填充低位被裁。这也是为什么无符号右移的结果总得到一个正数的原因。当然特殊情况除外(全是0的和移位运算过头的)。
移位运算的一些法则:
① 对于低于int类型的(如byte,short,char)要进行移位时要先转换成int类型然后再移位。
② 对于int类型的移位运算(右移)如果移位数大于32那么就要先那移位数取32的余数然后再移位例如33的右移与1的右移相同。同样的long类型的移位数大于64时就先要用移位数取64的余然后再移位。