“3.7 关系操作符”这一小节讲了关系操作符,该操作符生成的是一个boolean的结果,他们计算的是操作数的值之间的关系,即真假关系(true or false)。基本类型操作数的值的比较在这里就不说了,小学数学的知识。本小节开头直接举了个对象比较的例子:
publicclassEquivalence { publicstaticvoidmain(String[] args) { Integern1=newInteger(47); Integern2=newInteger(47); System.out.println(n1==n2); System.out.println(n1!=n2); } }
/* Output:
false
true
*///:~
乍一看可能你会觉得不理解,为啥两个都是47,确不相等。这里就是==作用于对象之间比较跟基本类型的不同之处了。尽管对象的内容相同,然而对象的引用确实不同的,而==与!=比较的就是对象的引用。如果想要比较两个对象的实际内容是否相同,必须使用所有对象都适用的特殊方法equals()。
System.out.println(n1.equals(n2)); //output true
文中又举了一个自定义类的equals()但是输出居然是false!这是因为自定义类的equals()的默认行为是比较引用,需要覆盖该方法实现我们希望的比较逻辑才能达到我们的目的。Integer 类的equals()方法做了如下重写:
publicbooleanequals(Objectobj) { if (objinstanceofInteger) { returnvalue== ((Integer)obj).intValue(); } returnfalse}
把Integer转换成了int基本类型做的比较,不就是相当于47==47么。
“3.8 逻辑操作符”讲到了数理逻辑中的与&&、或(||)、非(!)以及这些逻辑操作符与关系运算符的组合使用。上面我们接触的关系操作符是相等和不等,其他的还有大于(>),小于(<),大于等于(>=),小于等于(<=)。在JAVA中逻辑操作符只可应用于布尔值,当使用逻辑操作符时,我们会遇到一种”短路”现象。即一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下部分了,整个表达式靠后的部分有可能就不会被运算,下面用个例子说明:
importstaticnet.mindview.util.Print.*; publicclassShortCircuit { staticbooleantest1(intval) { print("test1("+val+")"); print("result: "+ (val<1)); returnval<1; } staticbooleantest2(intval) { print("test2("+val+")"); print("result: "+ (val<2)); returnval<2; } staticbooleantest3(intval) { print("test3("+val+")"); print("result: "+ (val<3)); returnval<3; } publicstaticvoidmain(String[] args) { booleanb=test1(0) &&test2(2) &&test3(2); print("expression is "+b); } }
/* Output:
test1(0)
result: true
test2(2)
result: false
expression is false
*///:~
对于&&操作符,如果前面的操作符返回的是false,那么后面的操作符就不参与计算和判断了。对于||操作符,如果前面的操作符返回的是true,那么后面的操作符就不参与计算和判断了。翻译成数学语言就是:对于与操作,有一个为假,整个表达式肯定为假;对于或操作,有一个为真,整个表达式肯定为真。这点在数学方面和计算机方面的表达式一致的。