何时未分配的表达式是有效的语句?

我已经阅读了Oracle的表达式教程 ,无法理解这一点。

众所周知,以下代码行是有效的Java语法:

new Object(); 

但是,当我用原始表达式尝试这个时:

 (3 + 2); 

Eclipse显示编译错误“赋值的左侧必须是变量”。

这不仅适用于原语,也适用于String文字:

 "arbitraryString"; 

那么,未分配的表达式作为Java代码行有效的规则是什么?

该规则在Java语言规范中 :

某些类型的表达式可以用分号跟随它们作为语句。

ExpressionStatement:

  • StatementExpression;

StatementExpression:

  • 分配
  • PreIncrementExpression
  • PreDecrementExpression
  • PostIncrementExpression
  • PostDecrementExpression
  • 的MethodInvocation
  • ClassInstanceCreationExpression

您会看到构造函数调用是一个语句。 但字符串文字或数学表达式不是。

创建一个对象或调用或方法可能会产生副作用,我认为这是造成这种情况的主要原因,而算术表达式则不会发生任何事情。

仅包含的行

 new Object(); 

或者更确切地说

 new SomeClass(); 

是可以接受的,因为SomeClass()构造函数的代码可能就是我们想要的。

但是如果只包含线条

 "foo"; 

要么

 2;//or (2+3); 

编译器知道除了创建/重用String literal或integer literal之外,这段代码不做任何其他事情,这意味着它可能是某种程序员错误,因此编译器无法接受它。

您正在寻找表达式和表达式语句之间的区别。 像myVoid();这样的语句myVoid(); 可以写成一个声明:这些是无效方法等(这是你知道的部分)。 表达式,如(3 + 2);"arbitraryString" ,没有副作用。 它们只能被视为一个值,因为不执行任何代码。 表达式语句,如new Object(); 可以有副作用并执行代码,有时您只需要执行此代码并忽略返回的值。 因此编译器允许这样做。