void方法调用是否算作表达式?

enyaitl3  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(273)

在本java文档教程中:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html
system.out.println(),这是一个void方法调用,不算作表达式,但在规范的以下链接中:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/expressions.html
据说表达式可以是计算结果为零(void)的东西。这导致了我的问题和困惑:在java中,void方法调用是否算作表达式?背后的原因是什么呢?

8xiog9wr

8xiog9wr1#

对void方法的调用仍然是一个表达式。所有方法调用都是(主)表达式,如产生式规则所指定:

Primary:
  PrimaryNoNewArray 
  ArrayCreationExpression
PrimaryNoNewArray:
  Literal 
  ClassLiteral 
  this 
  TypeName . this 
  ( Expression ) 
  ClassInstanceCreationExpression 
  FieldAccess 
  ArrayAccess 
  MethodInvocation <----
  MethodReference

只是语言中的其他规则让你无法用它做很多事情。这样的表达式属于 void . 不能声明类型为的变量 void . void 没有任何成员等。
在lambda表达式体中,void方法调用是表达式这一事实变得很重要。考虑生产规则:

LambdaBody:
  Expression 
  Block

如果void方法调用不是表达式,则无法写入:

Runnable r = () -> System.out.println();

上述方法之所以有效,是因为 System.out.println() 是表达式,因此可以用作lambda体。如果不是表达式,则必须使用块:

Runnable r = () -> { System.out.println(); };

归根结底,表达式是一种语法性的东西,而在语法层次上,解析器无论如何也不能判断方法的返回类型:d。

相关问题