操作符
操作符接受一个或多个参数, 并生成一个新的值.
操作符的优先级
优先级从上到下依次递减
[ ] . ( ) (方法调用) 从左向右
:: (方法引用)
! ~ ++ -- +(一元运算) -(一元运算) 从右向左
* / % 从左向右
+ - 从左向右
<< >> >>> 从左向右
< <= > >= instanceof 从左向右
== != 从左向右
& 从左向右
^ 从左向右
| 从左向右
&& 从左向右
|| 从左向右
?: 从右向左
= 从右向左
赋值操作符:
对于基本数据类型:
- 取右边值, 复制给左边.
- 右边值可以为任何常数, 表达式, 变量, 只要可以产生一个值
- 左边必须是一个明确的已命名变量, 不许有实际的物理空间可以存储.
- 常数不可以被赋值.
对于对象:
- 首先明确, 我们操作的只是对象的引用, 实际上我们只能操作对象的引用.
- 即对象的赋值是吧对象的引用从一个地址复制到另一个地址
- 两个引用可以同时操作同一个对象的现象, 称作别名现象.
- 别名现象在方法参数传递时也会出现, 相反, 也可以被很好地利用. 比如你可以重构出一段不需要返回值的代码, 对调用这段代码的方法里的一些对象直接进行操作. 这样做的时候需要注意代码设计的风格和一致性.
算术操作符:
- 整数除法直接去掉余数, 没有四舍五入操作
- 运算符赋值可以作用于所有算术操作符, 在其后添加"="即可, 比如
- a += b 等价于 a = a + b
递增与递减
- b = a++ 等价于
- b = a;
- a = a + 1;
- b = --a 等价于
- a = a - 1
- b = a;
关系操作符
比较左右两边的值, 生成boolean结果
逻辑操作符
与: &&
或: ||
非: !
根据逻辑关系产生布尔值.
注意
短路操作: 比如有如下表达式
- (test(a) && test(b))
- 如果test(a)为假, 则test(b)不会执行
按位操作符
用于操作int中的单个比特(bit), 或者叫二进制位. 按位操作符对两个参数中对应的比特为执行布尔运算, 并最终生成一个结果. 通常面向于操作底层.
- 与&: 两个输入位都是1, 才输出1
- 或|: 只要有一个输入位是1, 就输出1
- 异或^: 两个输入的所有二进制位都不相同时, 才输出1
- 取反~(一元操作符, 只有一个输入): 输入位为0, 输出1, 反之输出0.
移位操作符
依然操作二进制位, 只能用于int.
- 左移操作符<<: 操作符右侧为要移动的位数, 左侧为操作数. 表示将操作数位为1的所有为位同时向左移动多少位.
- 规则: 丢弃最高位, 0补最低位.
- 在没有超位的情况下, 移动了多少位就相当于对操作数*2的(移动位数)的次方:
- 设a = 3, b = 6
- a转为二进制为: 0000 0000 0000 0000 0000 0000 0000 0011
- c = a << b, c 的二进制为0000 0000 0000 0000 0000 0000 1100 0000,
- 1100 0000转为十进制为192
- 超位的情况下:
- a = 999, b = 31
- a的二进制: 0000 0000 0000 0000 0000 0011 1110 0111
- c = a << b, c的二进制为1000 0000 0000 0000 0000 0000 0000 0000
- c转为十进制为: -2147483647
- 当所有补位都为0时, 也就是移动位数等于该类型的长度时, 还原所有二进制位
- 当移动位数大于32位时, 从左开始继续向左移动位数 - 32位
- 右移操作符>>(有符号位):
- 向右移动操作数n位, 如果符号位为0, 则补0, 反之补1
- 右移操作相当于一个数除以2的n次方
- 右移操作符(无符号位):
- 不论符号位是什么, 直接补0
- 如果对char, byte, short类型的数值移位, 则在计算之前将被首先转换成int类型, 返回的结果也是int.
- 移位赋值操作符:
- <<=, >>=, >>>=
- 可以与等号联用, 等价于先计算再赋值.
三元条件操作符
boolean-exp ? value0 : value1
布尔表达式为真时, 将value0赋值给最右端, 否则将value1赋值给最右端.
字符串操作符
string1 = string1 + string2, string1 += string2
以上两句语义相同. 但是需要注意, 如果表达式以字符串起头, 则后续必须为字符串, 双引号内的也被自动转成字符串, 加入后续出现了对象, 则自动调用对象的toString方法.
直接常量和后缀字符
直接常量后缀字符标示了他的类型。L代表long,F代表float,D代表double。
十六进制数适用于所有整数数据类型。前缀以0x后面跟随0-F表示(此处为该数据类型最大值)
八进制数据类型则以0-7的数字表示。
二进制数直接用其他变量调用integer和long类的静态方法toBineryString()转化。