使用位运算符有两种情况:
对于布尔型
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任务?
您可以在这里找到答案:
当a,^,或|运算符的类型为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
我不知道询问它是否过载是什么意思,因为因为它可以用于不同的类型,所以它是过载的。
我不完全确定你在问什么,但至少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