- 具有较高优先级的运算符在相对较低的优先级的运算符之前被评估。
- 当在相同的表达式中出现相同优先级的运算符时,必须首先对该规则进行评估。
- 除了赋值运算符外,所有二进制运算符进行评估从左到右,赋值操作符是从右到左。
运算符优先级表(从高到低):
| 类别 | 运算符 | ||
|---|---|---|---|
| 括号 | () |
||
| 正负号 | + - ! |
||
| 位逻辑运算符 | ~ |
||
| 一元运算(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—),会先生成值,再执行运算。
/*i++、++i的i都+1i++ 相当于 i=i;i=i+1;++i 相当于 i=i+1;i=i;*/int i=0;System.out.println(i);// i=0System.out.println(++i); // i=1;print 1;i=1System.out.println(i);// i=1System.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 ? :
if(a){// 满足a执行}else if(b){// 不满足a,满足b执行}else{}
关系操作符
==:相等(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 不是任何类的实例
class InstanceofDemo {class Parent {}class Child extends Parent implements MyInterface {}interface MyInterface {}public static void main(String[] args) {// Must qualify the allocation with an enclosing instance of type InstanceofDemoParent obj1 = new InstanceofDemo().new Parent();Parent obj2 = new InstanceofDemo().new Child();System.out.println("obj1 instanceof Parent: "+ (obj1 instanceof Parent));System.out.println("obj1 instanceof Child: "+ (obj1 instanceof Child));System.out.println("obj1 instanceof MyInterface: "+ (obj1 instanceof MyInterface));System.out.println("obj2 instanceof Parent: "+ (obj2 instanceof Parent));System.out.println("obj2 instanceof Child: "+ (obj2 instanceof Child));System.out.println("obj2 instanceof MyInterface: "+ (obj2 instanceof MyInterface));}}输出结果:obj1 instanceof Parent: trueobj1 instanceof Child: falseobj1 instanceof MyInterface: falseobj2 instanceof Parent: trueobj2 instanceof Child: trueobj2 instanceof MyInterface: true
位操作符
按位操作符
基于二进制进行运算& :与(1与1=1,其他为0)| :或 (0或0=0,其他为1)^ :异或 (1异或1=0,0异或0=0,1异或0=1)~ :非(把0变成1,把1变成0)
int bitmask = 0x000F;int val = 0x2222;// prints "2"System.out.println(val & bitmask);
移位操作符
首先我们先阐述一下符号位的概念:
- 符号位:是数的最后一位,不用来计算的;
- 当符号位为0时,值为正数;当符号位为1时,值为负数;
- 无符号位时为正数,有符号位时为正数或者负数;
<< :左移>> :右移>>> :右移(补零)
左移(<<) 运算形式:值 << 位数
右移(>>) 运算形式:值 >> 位数
移动后,左移、右移都会保留符号位!
右移(补零),移动后,不保留符号位,永远为正数,左边补零,因为其符号位总是被补零;
int a = 3*2*2;int b = 3<<2; //相当于:3*2*2;int c = 12/2/2;int d = 12>>2; //相当于12/2/2;
