Что касается первого вопроса Почему компилировать?
Unedited версия: Это не компилируется
Это даст ошибку компиляции, поскольку if(null=var) { ...
не правильный код Java. Вы не можете присвоить что-то null
, вы можете только присваивать null
что-то.
Возможно, вы захотите использовать ==
вместо var
и null
для обеспечения равенства.
Кроме того, во время выполнения вы получите NPE
как @Ctx, уже правильно упомянутый. Линия boolean var1=(var=null);
будет в первую очередь назначить null
на var
, то оператор присваивания =
вернет то, что он только что назначен (null
) и попытаться назначить, что в boolean var1
->NPE
.
- "Означает ли это, что
null
рассматривается как false
?" - нет t действительно. Только при разборе String
, который составляет null
, это обрабатывается как false
. Это в основном единственное место/ситуация.
После редактирования меняющегося null=var
в var=null
:
Теперь ваш код будет скомпилирован и аварии с NPE
. Давайте рассмотрим, что здесь происходит шаг за шагом:
Boolean var=false;
Boolean
объект создается с помощью автоматического бокса Значение boolean
false
boolean var1=(var=null);
Первая операция (var=null)
, которая присваивает null
к var
. =
поэтому возврат null
. Затем оператор «эквивалентен» boolean var1=null
, который компилятор отклонил бы. К сожалению, компилятор не способен вывести, что оператор boolean var1=(var=null);
всегда приведет к недопустимому присвоению boolean var1=null
. Поэтому код компилируется, но сбой во время выполнения.
Почему вы не начать свою программу и посмотреть, что происходит? Btw: 'if (null = var)' не будет компилироваться ... – Tom
'if (null = var)' никогда не компилируется. –
P.S: Var1 может быть правдой. = будет присвоить значение == будет сравнивать. В "boolean var1 = (var = null);" родительство - это просто утверждение. И в "if (null = var) {" он не должен компилироваться. Вы не можете определить значение до нуля – borjab