为何这段Java代码仅输出"false"而非"false false"?
问题解析:为什么代码只输出"false"而非"false false"?
先看你给出的代码:
class test { public static void main(String[] args){ Object o1 = new Object(); Object o2 = new Object(); System.out.println(o1==o2 + " " + o1.equals(o2)); } }
你疑惑明明o1==o2和o1.equals(o2)的结果都是false,为什么输出不是"false false"而是只有一个"false"?
核心原因是Java的运算符优先级规则:字符串连接运算符+的优先级要高于相等比较运算符==。所以你写的表达式:
o1==o2 + " " + o1.equals(o2)
Java会按照这样的顺序来解析:
- 先执行
o2 + " ":因为o2是Object对象,和字符串做+运算时会自动调用toString()把对象转成字符串(比如类似java.lang.Object@7852e922这样的格式) - 再把上面的结果和
o1.equals(o2)的结果(也就是false)做字符串连接,得到一个长字符串,比如"java.lang.Object@7852e922 false" - 最后用
o1和这个长字符串做==比较——一个Object对象和一个String对象显然不是同一个引用,所以结果是false,这就是控制台输出的内容。
要得到你预期的"false false",只需要给两个比较表达式加上括号,强制改变运算顺序:
System.out.println( (o1==o2) + " " + (o1.equals(o2)) );
加上括号后,Java会先分别计算(o1==o2)和(o1.equals(o2))的结果(都是false),再把这两个布尔值转成字符串后用空格连接,最终输出"false false"。
内容的提问来源于stack exchange,提问作者Zoltán Vári
相关产品推荐
相关产品推荐

