我已阅读Oracle's expressions tutorial并且无法理解这一点。
众所周知,以下代码行是有效的Java语法:
new Object();
然而,当我用原始表达式尝试这个时:
(3 + 2);
Eclipse显示编译错误"作业的左侧必须是变量"。
这不仅适用于基元,也适用于字符串文字:
"arbitraryString";
那么,未分配的表达式作为Java代码行有效的规则是什么?
答案 0 :(得分:30)
该规则位于Java Language Specification:
某些类型的表达式可以用分号跟随它们作为语句。
ExpressionStatement:
- StatementExpression;
StatementExpression:
- 分配
- PreIncrementExpression
- PreDecrementExpression
- PostIncrementExpression
- PostDecrementExpression
- 的MethodInvocation
- ClassInstanceCreationExpression
您看到构造函数调用是一个语句。但字符串文字或数学表达式不是。
答案 1 :(得分:9)
创建一个对象或调用或方法可能会产生副作用,我认为这是造成这种情况的主要原因,而算术表达式则不会发生任何事情。
答案 2 :(得分:5)
仅包含
的行new Object();
或者更准确
new SomeClass();
是可以接受的,因为SomeClass()
构造函数的代码可能是我们想要的。
但是如果只包含
的行"foo";
或
2;//or (2+3);
编译器知道除了创建/重用String literal或integer literal之外,这段代码不会做任何其他事情,这意味着它可能是某种程序员错误,因此编译器无法接受它。
答案 3 :(得分:5)
您正在寻找表达式和表达式语句之间的区别。像myVoid();
这样的陈述可以写成一个陈述:这些是无效方法等(这是你知道的部分)。表达式(如(3 + 2);
和"arbitraryString"
)没有副作用。它们只能被视为一个值,因为没有代码被执行。表达式语句(如new Object();
)可能有副作用并执行代码,有时您只需要执行此代码并忽略返回的值。因此编译器允许这样做。