重温经典《Thinking in java》第四版之第三章 操作符(十八)

简介: 重温经典《Thinking in java》第四版之第三章 操作符(十八)

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,那么后面的操作符就不参与计算和判断了。翻译成数学语言就是:对于与操作,有一个为假,整个表达式肯定为假;对于或操作,有一个为真,整个表达式肯定为真。这点在数学方面和计算机方面的表达式一致的。

目录
相关文章
|
1月前
|
Java 编译器
Java“操作符 ... 不能应用于 x”解决
当Java编译器报错“操作符 ... 不能应用于 x”时,通常是因为你尝试对不支持该操作符的数据类型执行了操作。解决方法包括:确保数据类型兼容、使用正确的类型转换或选择合适的方法。检查代码中的变量类型和操作符使用是否正确。
|
6月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
6月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
57 2
|
5月前
|
缓存 并行计算 Java
重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南
重温JAVA线程池精髓:Executor、ExecutorService及Executors的源码剖析与应用指南
|
6月前
|
存储 Java 编译器
Java基础教程(4)-Java中的操作符
【4月更文挑战第4天】Java中的String是常用类,字符串是不可变对象,用双引号表示。String对象在编译期长度受限于65535,运行期不超过Int范围。字符串方法如length()、substring()、replace()、equals()等提供了多种操作。可变字符串可使用StringBuffer或StringBuilder。String对象通过字符串池优化内存,池中已有相同内容字符串则返回其引用。
|
6月前
|
设计模式 算法 Java
重温经典《Thinking in java》第四版之第九章 接口(四十七)
重温经典《Thinking in java》第四版之第九章 接口(四十七)
49 0
|
6月前
|
安全 Java 程序员
重温经典《Thinking in java》第四版之第八章 多态(四十五)
重温经典《Thinking in java》第四版之第八章 多态(四十五)
51 1
|
6月前
|
存储 设计模式 缓存
Java instanceof操作符:类型检查的必备工具
Java instanceof操作符:类型检查的必备工具
89 0
|
6月前
|
Java 编译器 C++
重温经典《Thinking in java》第四版之第九章 接口(四十六)
重温经典《Thinking in java》第四版之第九章 接口(四十六)
40 0