不同情况下的单身平等

Single equal in different situation

我有这个代码...

class Test {

    public static void main(String[] args) {
        Boolean mySuperBoolean = Boolean.FALSE;

        System.out.print("a");
        if (mySuperBoolean = Boolean.TRUE) {
            System.out.print("b");
        }

        System.out.print("c");
    }
}

我是 Java 的新手,但我知道单等号 (=) 用于赋值。双等号 (==) 用于检查对象是否指向内存中的同一位置。但是,在这种情况下,我不明白 'b' 是如何用单个等号打印的,但我知道将其更改为双等号不会打印出来

if (mySuperBoolean = Boolean.TRUE)assign Boolean.TRUE 给你的 mySuperBoolean 变量并且条件将评估为真,因此无论你里面的是什么会一直执行

赋值运算符=的结果将是赋值。所以 if (mySuperBoolean = Boolean.TRUE) 将始终评估为 true.

本质上,这里发生的事情归结为:

if (Boolean.TRUE) {
  System.out.print("b");
}

该赋值将 TRUE 放入变量,变量为布尔值,并检查其当前值,故事结束。

赋值是一个 expression,它解析为赋值的任何内容,在这种情况下,
(mySuperBoolean = Boolean.TRUE) 是一个解析为 Boolean.TRUE.

的表达式

这实际上只在少数特定情况下有用。一种这样的情况是以下成语:

String line;
while ((line = readLine()) != null) {
    //...
}

甚至

i = j = k = 0; // equal to: i = (j = (k = 0))

这是一个有争议的功能,因为它允许可能 的错误(例如您的错误)成功编译。为了缓解这种情况,有些人会反转操作数("yoda condition"):

if (Boolean.TRUE == mySuperBoolean)

这是有效的,因为如果我忘记了第二个等号,那么编译器将抛出一个错误,因为 Boolean.TRUE 是最终的,无法分配给。