使用按位运算符有两种情况:
对于布尔值
boolean a = true;
boolean b= false;
boolean c = a|b; // Giving response after logical OR for booleans.
对于整数
int a = 10;
int b = 20;
int c = a|b; // Giving response after bitwise OR for boolean equivalents of "a" and "b".
上述两种情况均符合http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2。
运营商 | 是否已超载?
我只是想问一个非常简单的问题:是“|”对于两个布尔值(当然是二进制当量)和整数?
,它是否重载或执行相同的按位OR任务答案 0 :(得分:4)
您可能会找到答案here:
当&,^或|的两个操作数时运算符的类型为boolean或 布尔值,然后按位运算符表达式的类型是布尔值。 在所有情况下,操作数都需要进行拆箱转换(§5.1.8) 必要时。
如果您在|
上使用boolean
运算符,那么结果就像使用||
一样,但请注意区别在于:
boolean a = true, b = false;
boolean c = a | b; //b will still be evaluated
c = a || b; //b will not be evaluated
我不确定它是否意味着它是否过载,因为它可以在不同的类型上使用,它会被重载。
答案 1 :(得分:2)
我不完全确定你在问什么,但至少boolean c = a|b
和boolean c = a||b
之间的字节码是不同的:
boolean a = true;
boolean b = false;
boolean c = a|b;
ILOAD 1
ILOAD 2
IOR
ISTORE 3
boolean c = a||b;
ILOAD 1
IFNE L4
ILOAD 2
IFNE L4
ICONST_0
因此,两个运算符有效地导致字节码级别的不同操作。最具体地说,||
仅在第一个操作数为false
时计算第二个操作数,而|
在任何情况下都计算两个操作数:
public boolean a() {
System.out.println(" a");
return true;
}
public boolean b() {
System.out.println(" b");
return false;
}
public void c() {
System.out.println("a() | b()");
boolean r1 = a() | b();
System.out.println("\na() || b()");
boolean r2 = a() || b();
}
输出:
a() | b()
a
b
a() || b()
a
同时,整数按位的字节码或与布尔按位或:
相同int a1 = 10;
int a2 = 20;
int c1 = a1 | a2;
ILOAD 4
ILOAD 5
IOR
ISTORE 6