Подтвердить что ты не робот

Когда непризнанное выражение является допустимым выражением?

Я прочитал учебник по выражениям Oracle и не мог понять этого.

Хорошо известно, что следующая строка кода является допустимым синтаксисом Java:

new Object();

Однако, когда я пробую это с примитивным выражением:

(3 + 2);

Eclipse показывает ошибку компиляции "Левая часть назначения должна быть переменной".

Это верно не только для примитивов, но и для строковых литералов:

"arbitraryString";

Итак, каково правило, что неназначенное выражение должно быть действительным как строка кода Java?

4b9b3361

Ответ 1

Правило находится в Спецификация языка Java:

Некоторые типы выражений могут использоваться в качестве операторов, следуя за ними с точками с запятой.

ExpressionStatement:

  • StatementExpression;

StatementExpression:

  • Назначение
  • PreIncrementExpression
  • PreDecrementExpression
  • PostIncrementExpression
  • PostDecrementExpression
  • MethodInvocation
  • ClassInstanceCreationExpression

Вы видите, что вызов конструктора является выражением. Но строковое литераловое или математическое выражение не является.

Ответ 2

Создание объекта или вызова или метода может иметь побочные эффекты, я думаю, что это основная причина этого, тогда как ничего не произойдет с арифметическим выражением.

Ответ 3

Строка, содержащая только

new Object(); 

или, если быть точнее,

new SomeClass(); 

является приемлемым, поскольку код конструктора SomeClass() может быть всем, что мы хотим.

Но в случае строк, содержащих только

"foo";

или

2;//or (2+3);

компилятор знает, что помимо создания/повторного использования строкового литерала или целочисленного литерала этот код не делает ничего другого, что означает, что это, вероятно, какая-то ошибка программиста, поэтому компилятор не может его принять.

Ответ 4

Вы ищете разницу между выражениями и выражениями-выражениями. Выражения типа myVoid(); могут быть записаны как утверждение: это недействительные методы и т.д. (Это часть, которую вы знаете). Выражения, такие как (3 + 2); и "arbitraryString", не имеют побочных эффектов. Их можно рассматривать только как значение, поскольку код не выполняется. Операторы выражения, такие как new Object();, могут иметь побочные эффекты и выполнять код, а иногда просто требуется, чтобы этот код выполнялся и игнорировал возвращаемое значение. Поэтому компилятор допускает это.