• 具有较高优先级的运算符在相对较低的优先级的运算符之前被评估。
  • 当在相同的表达式中出现相同优先级的运算符时,必须首先对该规则进行评估。
  • 除了赋值运算符外,所有二进制运算符进行评估从左到右,赋值操作符是从右到左。

运算符优先级表(从高到低):

类别 运算符
括号 ()
正负号 + - !
位逻辑运算符 ~
一元运算(unary) ++ --
乘法(multiplicative) * / %
加法(additive) + -
移位运算(shift) << >> >>>
关系(relational) < > <= >= instanceof
相等(equality) == !=
与运算(bitwise AND) &
异或运算(bitwise exclusive OR) ^
或运算(bitwise inclusive OR) ` `
逻辑与运算(logical AND) &&
逻辑或运算(logical OR) ` `
三元运算(ternary) ? :
赋值运算(assignment) = += -= *= /= %= &= ^= ` =`<<= >>= >>>=

赋值操作符

= :将右操作数的值赋给左操作数
+=:加和赋值操作符,将左右操作数相加赋值给左操作数
-= :减和赋值操作符,将左右操作数相减赋值给左操作数
*= :乘和赋值操作符,将左右操作数相乘赋值给左操作数
/= :除和赋值操作符,将左右操作数相除赋值给左操作数
%= :取模和赋值操作符,将左右操作数取模后赋值给左操作数
&= :按位与赋值运算符,转化为二进制进行与运算后赋值
^= :按位异或赋值运算符,转化为二进制进行异或运算后赋值
|=:按位或赋值运算符,转化为二进制进行或运算后赋值
<<=:左移位赋值运算符,转化为二进制进行左移运算后赋值
>>= :右移位赋值运算符,转化为二进制进行右移运算后赋值
>>>= :右移(补零)赋值运算符,转化为二进制进行右移(补零)运算后赋值

算术操作符

一元操作符

一元运算符只需要一个操作数。
+:指正数
-:指负数
++:递增运算符;递增值1
--:递减运算符;递减值1
:逻辑补运算;反转一个布尔值
前缀递增/递减(如++a或—a),会先执行运算,再生成值。
后缀递增/递减(如a++或a—),会先生成值,再执行运算。

  1. /*
  2. i++、++i的i都+1
  3. i++ 相当于 i=i;i=i+1;
  4. ++i 相当于 i=i+1;i=i;
  5. */
  6. int i=0;
  7. System.out.println(i);// i=0
  8. System.out.println(++i); // i=1;print 1;i=1
  9. System.out.println(i);// i=1
  10. System.out.println(i++);// i=1;print 1;i=2

二元操作符

+ - * / %

整数运算
1. 如果两个操作数有一个为Long, 则结果也为long。
2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。

浮点运算
1. 如果两个操作数有一个为double,则结果为double。
2. 只有两个操作数都是float,则结果才为float。

取模运算
1.其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。

三元操作符

if else ? :

  1. if(a){
  2. // 满足a执行
  3. }else if(b){
  4. // 不满足a,满足b执行
  5. }else{
  6. }

关系操作符

==:相等(equal to)
!=:不相等(not equal to)
>:大于(greater than)
>=:大于等于(greater than or equal to)
<:小于(less than)
<=:小于等于(less than or equal to)

逻辑操作符

&&:条件与(Conditional-AND),短路与,前者条件为false,就不会执行后者条件
||:条件或(Conditional-OR)
?::三元运算符(ternary operator)

instanceof 运算符

可以用instanceof判断一个类是否实现某个接口,也可以判断一个实例对象是否属于某个类型或者某个类型的子类
对象 instanceof 类(或接口)—-> return Boolean值
注:null 不是任何类的实例

  1. class InstanceofDemo {
  2. class Parent {}
  3. class Child extends Parent implements MyInterface {}
  4. interface MyInterface {}
  5. public static void main(String[] args) {
  6. // Must qualify the allocation with an enclosing instance of type InstanceofDemo
  7. Parent obj1 = new InstanceofDemo().new Parent();
  8. Parent obj2 = new InstanceofDemo().new Child();
  9. System.out.println("obj1 instanceof Parent: "
  10. + (obj1 instanceof Parent));
  11. System.out.println("obj1 instanceof Child: "
  12. + (obj1 instanceof Child));
  13. System.out.println("obj1 instanceof MyInterface: "
  14. + (obj1 instanceof MyInterface));
  15. System.out.println("obj2 instanceof Parent: "
  16. + (obj2 instanceof Parent));
  17. System.out.println("obj2 instanceof Child: "
  18. + (obj2 instanceof Child));
  19. System.out.println("obj2 instanceof MyInterface: "
  20. + (obj2 instanceof MyInterface));
  21. }
  22. }
  23. 输出结果:
  24. obj1 instanceof Parent: true
  25. obj1 instanceof Child: false
  26. obj1 instanceof MyInterface: false
  27. obj2 instanceof Parent: true
  28. obj2 instanceof Child: true
  29. obj2 instanceof MyInterface: true

位操作符

按位操作符

基于二进制进行运算
& :与(1与1=1,其他为0)
| :或 (0或0=0,其他为1)
^ :异或 (1异或1=0,0异或0=0,1异或0=1)
~ :非(把0变成1,把1变成0)

  1. int bitmask = 0x000F;
  2. int val = 0x2222;
  3. // prints "2"
  4. System.out.println(val & bitmask);

移位操作符

首先我们先阐述一下符号位的概念:

  • 符号位:是数的最后一位,不用来计算的;
  • 当符号位为0时,值为正数;当符号位为1时,值为负数;
  • 无符号位时为正数,有符号位时为正数或者负数;

<< :左移
>> :右移
>>> :右移(补零)

左移(<<) 运算形式:值 << 位数
右移(>>) 运算形式:值 >> 位数
移动后,左移、右移都会保留符号位!
右移(补零),移动后,不保留符号位,永远为正数,左边补零,因为其符号位总是被补零;

  1. int a = 3*2*2;
  2. int b = 3<<2; //相当于:3*2*2;
  3. int c = 12/2/2;
  4. int d = 12>>2; //相当于12/2/2;