instanceof 运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。
instanceof运算符使用格式如下:
( Object reference variable ) instanceof (class/interface type)
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。
下面是一个例子:
String name = "James"; boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
如果被比较的对象兼容于右侧类型,该运算符仍然返回true。
在判断一个实例引用的类型时,使用的是实际类型,而不是声明的类型。在下面的代码中,
Vehicle v2 = new Car(); // v2 是 Car 类型
v2 是 Car 类型,而不是 Vehicle 类型。
class Vehicle {}
public class Car extends Vehicle {
public static void main(String args[]){
Car c1 = new Car();
Vehicle v2 = new Car(); // v2 是 Car 类型
Vehicle v3 = new Vehicle();
//Car 是 Vehicle类型, Vehicle 不是 Car 类型
boolean result1 = c1 instanceof Vehicle; // true
boolean result2 = v2 instanceof Car; // true
boolean result3 = v2 instanceof Vehicle; // true
boolean result4 = v3 instanceof Car; // false
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
System.out.println(result4);
}
}
Java运算符优先级
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。
1.下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr-- | 从左到右 |
一元 | ++expr --expr + - ~ ! | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | | | | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |
- 所有的数学运算符都认为是从左到右运算的,Java 语言中大部分运算符也是从左到右结合的
- 单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。
2.C + = A 与 C = C + A 是有区别的一句话总结: += 运算符既可以实现运算,又不会更改 s 的数据类型;而后者,C 和 A 必须是同一类型,否则无法直接运算。
public class Student{
public static void main(String[] args){
short s = 10;
//s = s + 3; 编译不通过
s = (short)(s + 1); //不建议如此实现
s += 1; //既可以实现运算,又不会更改s的数据类型
System.out.println("输出变量");
}
}
另外, -= , *= , /= 也应同理。
3.整数运算:
- 1、如果两个操作数有一个为 long,则结果也为 long。
- 2、没有 long 时,结果为 int。即使操作数全为 short、byte,结果也是 int。
public class Main {
public static void main(String[] args) {
byte a = 1;
int b = 2;
long b2 = 3;
byte c = a + b; // 报错
int c2 = b2 + b; // 报错
}
}
4.关联性
Java 中关联性顺序不同指左右结合的顺序不同,对于三目运算符,关联性是从右向左的。例如:
a ? b: c ? d : e
根据关联性结果为 a ? b : (c ? d : e), 即将右侧运算作为一个整体来进行运算,先进行 a 条件的判断。
int b = 2;
int d = (b<1) ? ++b : (b>1) ? --b : 2;
System.out.println(d) ;//结果为1, b的值为1
int b = 2;
int d = (b>1) ? ++b : (b>1) ? --b : 2;
System.out.println(d) ;//结果为3, b的值为3
参考: