几乎所有运算符都只能操作 “ 主类型 ” ( Primitives )。例外是 “=” 、 “= =” 和 “! =” ,它们能操作所有对象。除此以外, String 类支持 “+” 和 “+=” 。
(1) 赋值
主类型使用 “A=B” ,那么 B 处的内容就复制到 A 。若修改 A ,那么 B 根本不会受修改的影响。
对象 “ 赋值 ” 的时候情况发生了变化。对一个对象进行操作时,我们真正操作的是它的句柄。所以倘若 “ 从一个对象到另一个对象 ” 赋值,实际就是将句柄从一个地方复制到另一个地方。这意味着假若为对象使用 “C=D” ,那么 C 和 D 最终都会指向最初只有 D 才指向的那个对象。
short s1 = 1; s1 = s1 + 1; ( s1+1 运算结果是 int 型,需要强制转换类型)
short s1 = 1; s1 += 1; (可以正确编译) += 运算符无类型转换问题
( 2 )算术运算符
Java 的算术运算符:加号( + )、减号( - )、除号( / )、乘号( * )以及模数( % ,从整数除法中获得余数)。整数除法会直接砍掉小数,而不是进位。
( 3 )自动递增、递减
对于前递增和前递减(如 ++A 或 --A ),会先执行运算,再生成值。
对于后递增和后递减(如 A++ 或 A-- ),会先生成值,再执行运算。
( 4 )关系运算符
关系运算符包括 < 、 > 、 <= 、 >= 、 = = 、 !=
等于和不等于适用于所有内建的数据类型,但其他比较不适用于 boolean 类型。
想对比两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法 equals() 。
equals() 方法不适用于 “ 主类型 ” ,那些类型直接使用 = = 和 != 即可。
equals() 的默认是比较句柄。所以除非在自己的新类中改变了 equals() ,否则不可能表现出我们希望的行为
大多数 Java 类库都实现了 equals() ,所以它实际比较的是对象的内容,而非它们的句柄
= = 和 ! = 比较的是对象句柄,而不是对象的实际内容
( 5 )逻辑运算符
逻辑运算符 && 、 || 、 ! 能生成一个布尔值
& 和 && 都可作为逻辑运算符“与”使用,但是 && 是“短路 与”,运算时先判断符号前面的表达式的值,如果能够确定整个表达式的值,则不进行符号后面的表达式的运算。
另外, & 可作为位运算符使用
( 6 )按位运算符
按位 AND 运算符( & )
按位 OR 运算符( | )
按位 XOR ( ^ ,异或)
按位 NOT ( ~ ,也叫作 “ 非 ” 运算符)属于一元运算符,生成与输入位的相反的值
( 7 )移位运算符
左移位运算符( << )能将运算对象向左移动运算符右侧指定的位数(在低位补 0 )。
有符号右移位运算符( >> )将运算对象向右移动运算符右侧指定的位数。有符号右移位运算符使用了符号扩展:若值为正,则在高位插入 0 ;若值为负,则在高位插入 1
无符号右移位运算符( >>> ),它使用了 “ 零扩展 ” :无论正负,都在高位插入 0
( 8 )三元 IF-ELSE 运算符
布尔表达式 ? 值 0: 值 1 “ 布尔表达式 ” 的结果为 true ,就计算 “ 值 0” ,否则计算“值 1 ”
( 9 )字符串运算符+
int x = 0, y = 1, z = 2;
System.out.println(“out:” + x + y + z);
在这里, Java 编译程序会将 x , y 和 z 转换成它们的字串形式,而不是先把它们加到一起
运用 “String +” 时,若表达式以一个 String 起头,那么后续所有运算对象都会转换到字串。
想通过 “ 加号 ” 连接字串(使用 Java 的早期版本),请务必保证第一个元素是字串
( 10 )造型( Cast )运算符
对于 “ 缩小转换 ” ( Narrowing Conversion )的操作(能容纳更多信息的数据类型,将其转换成容量较小的类型,例如 int 转 short ),此时就可能面临信息丢失的危险。此时,编译器会强迫我们进行明确造型
对于 “ 放大转换 ” ( Widening conversion ),则不必进行明确造型 ,因为新类型肯定能容纳原来类型的信息,不会造成任何信息的丢失
布尔值( bollean )根本不允许进行任何造型处理,其它任何主类型可互相造型
将 float 或 double 值造型成整数值后,总是将小数部分 “ 砍掉 ” ,不作任何进位处理
Math.round(11.5) 等於多少 ? Math.round(-11.5) 等於多少 ?
Math.round(11.5)==12 Math.round(-11.5)==-11
round 方法返回与参数最接近的长整数 ,参数加 1/2 后求其 floor.
( 11 )优先级
运算符(优先级从低到高) |
+ - ++ – [[ rest...]] |
* / % + - << >> |
> < >= <= == != |
&& || & | ^ |
A > B ? X : Y |
= (and compound assignment like *=) |