关系操作符
- 任何对象的==都是内存地址比较,基本类型的==是值比较。
- 对象默认的equals是内存地址比较,大多数Java类库覆写成内容比较。
按位操作符
编译器自行进行二进制的转换和运算,并将结果转回原来的进制。
按位操作符可与等号=联合使用,以便合并运算和赋值,按位与&=、按位或|=、按位异或^=都是和合法的,非~是一元操作符,所以不可与=联合使用。
我们将布尔类型作为一种单比特值对待,所以它多少有点独特,我们可对它执行按位与、或、异或运算,但不能执行按位非,对于布尔值,按位操作符具有与逻辑操作符相同的逻辑,只是它们不会中途短路,会全部计算得出最后的结果。
移位操作符
- 左移位操作符(<<)低位补0
- 有符号右移位操作符(>>)高位补符号
- 无符号右移位操作符(>>>)高位补0 如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,它们会被转换成int类型,并且得到的结果也是一个int类型的值,只有数值右端的低5位才有用,这样可防止我们移位超过int型值所具有的位数,2^5=32,long同理是6位。
类型转换操作符
在适当的时候,Java会将一种数据类型自动转换成另一种,称为类型提升。如果是反向操作窄化转换,需要显式转换,自行承担丢失风险。
如果对基本数据类型执行算术运算或按位运算,只要类型比int小,那么在运算之前,这些值会自动转换成int,这样一来,最终生成的结果就是int类型,如果想把结果赋值给较小的类型,就必须使用类型转换。
{
short s1 = 1;
short s2 = 2;
int i1 = s1 & s2;
int i2 = s1 + s2;
}
Java允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。
常见错误
{
while(x = y) {
// ...
}
}
由于Java不会自动地将int数值转换成布尔值,所以在编译时会抛出异常,唯一不会得到编译时错误的情况是x和y都为布尔值,即便如此,while还是会陷入死循环。