何时未分配的表达式是有效的语句?
我已经阅读了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();
可以有副作用并执行代码,有时您只需要执行此代码并忽略返回的值。 因此编译器允许这样做。