在我的Java书中,它说“表达式是一种可以传达回报值的陈述。”这与我的传统理解不同。我以为表达式会返回一个值。不是CAN返回值。
这是来自Sams在21天内教你自己的Java。
答案 0 :(得分:3)
数学表达式总是返回一些东西,但Java表达式不必返回。 Java规范定义了what exactly is meant by the term expression in the Java language。另一个区别是表达式在Java中可能并且经常会产生副作用。副作用几乎发生在其他上而不是返回值。
引用Java语言规范:
程序中的大部分工作都是通过计算表达式来完成的,无论是因为它们的副作用,例如变量的赋值,还是它们的值,它们可以在较大的表达式中用作参数或操作数,或者影响执行语句中的序列,或两者兼而有之。
例如system.out.println("Hello World");
不返回值,但它会将Hello World
打印到输出流。这个输出数据的过程是调用println
的副作用。相比之下,Functional languages试图最小化对副作用的依赖,并更加贴近表达的数学定义。
Quoting from the JLS,这里是表达式的BNF grammar:
Primary:
PrimaryNoNewArray
ArrayCreationExpression
PrimaryNoNewArray:
Literal
Type . class
void . class
this
ClassName.this
( Expression )
ClassInstanceCreationExpression
FieldAccess
MethodInvocation
ArrayAccess
您可以看到MethodInvocation
是PrimaryNoNewArray
的扩展,是Primary
(表达式)的扩展。
答案 1 :(得分:2)
您的理解不完整。在Java中,表达式可以返回一个值,并且可以因异常而终止。类似的情况出现在支持例外的其他语言中,更普遍。 (例如,在C语言中,除以零会导致当前表达式求值终止而不返回值。)
另一种解释是(根据JLS),像System.err.println("hello")
这样的方法调用表达式可以为其上下文提供名义void
值,这实际上意味着它没有提供任何值。
我不认为这第二种解释是合理的。我们从一个“表达式”开始,该表达式被指定为传递空值。然后我们争辩说,因为虚空值实际上不是一个值,所以表达式什么都没有。最后,我们说这是一个没有价值的表达。
对这个例子的一个更简单的解释是,提供“无效”的“表达”在直觉上并不是真正的表达。当然,在Java中,您不能使用提供空的MethodInvocation表达式,其中需要非void传递表达式。并且您不能将非void表达式表达式用作Statement。
或者,我们可以坚持使用JLS处理并说“虚空”值确实是一个值...即使你不能对它做任何事情。根据这个论点,System.err.println("Hi")
毕竟是。
答案 2 :(得分:0)
方法public void foo();
不会返回任何内容,因此表达式foo()
不会返回任何内容。但如果方法是public int foo()
,那么它会。因此它可以返回一些东西,但不一定必须。 From the Java spec:
当且仅当它是方法调用时,表达式才表示任何内容 调用不返回值的方法,即方法 宣布无效。这样的表达式只能用作表达式 语句,因为表达式可以使用的每个其他上下文 出现需要表达式来表示某些东西。一种表达 作为方法调用的语句也可以调用一个方法 产生结果;在这种情况下,方法返回的值是 悄悄地丢弃了。
答案 3 :(得分:0)
表达式要么具有类型,要么可以计算得到该类型的值,或者是void
类型的值,并且可以进行求值以不产生任何效果。 JLS也表示表达式可以求值为变量,但变量又有一个类型和一个值。例如,1 + 1
是一个表达式。
另一方面,语句由表达式组成,但本身没有类型或值。例如,int x = 1 + 1;
没有价值。在Java中说System.out.println(int x = 1 + 1;);