为什么这个打印只有 "false" 而不是 "false false"?

Why is this print only "false" instead of "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==o2o1.equals(o2) 都是 false 但为什么它只打印出 "false" 而不是 "false false"?

这是因为==用作比较两个部分的表达式。

它比较 o1 与整个 o2 + " " + o1.equals(o2) 字符串.

我添加了空格以便更好地查看它。

System.out.println(o1   ==       o2 + " " + o1.equals(o2));

如果你想要双假。这是修改后的 println 语句。

System.out.println((o1 == o2) + "    " + o1.equals(o2));

K139 是正确的,但让我解释一下原因。乍一看这很棘手,但这全都归结为运算符优先级。

Java API Operators Tutorial

加法运算符+先于相等==

所以System.out.println(o1==o2 + " " + o1.equals(o2));

更清楚的是通过了争论: o1 == (o2 + " " + o1.equals(o2))

那是检查 o1 是否等同于 "java.lang.Object@123a439b false" 这样的字符串,结果是 false,你会看到它是唯一的输出。

在第一个等效性检查周围添加括号会导致操作按您想要的顺序执行。

System.out.println((o1==o2) + " " + o1.equals(o2));

这会产生:false false