- 具有较高优先级的运算符在相对较低的优先级的运算符之前被评估。
- 当在相同的表达式中出现相同优先级的运算符时,必须首先对该规则进行评估。
- 除了赋值运算符外,所有二进制运算符进行评估从左到右,赋值操作符是从右到左。
运算符优先级表(从高到低):
类别 | 运算符 | ||
---|---|---|---|
括号 | () |
||
正负号 | + - ! |
||
位逻辑运算符 | ~ |
||
一元运算(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都+1
i++ 相当于 i=i;i=i+1;
++i 相当于 i=i+1;i=i;
*/
int i=0;
System.out.println(i);// i=0
System.out.println(++i); // i=1;print 1;i=1
System.out.println(i);// i=1
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
? :
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 InstanceofDemo
Parent 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: true
obj1 instanceof Child: false
obj1 instanceof MyInterface: false
obj2 instanceof Parent: true
obj2 instanceof Child: true
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)
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;