我正在玩Java语法,所以这个问题纯粹是出于好奇。这段代码:
http://www.google.com
Object val = 5 <- 4;
不编译,因为标签(http
)"必须后跟一个语句"。以下两个变体可以编译:
http://www.google.com
{ Object val = 5 <- 4; }
和
Object val;
http://www.google.com
val = 5 <- 4;
在这两种情况下,我都从声明切换到表达式。 这让我想知道 Java 中的"语句"到底是什么,但是文档 国家:
除了表达式语句之外,还有另外两种类型的语句:声明语句和控制流语句。声明语句声明一个变量。
JLS只是说(在标签上)
标识符被声明为立即包含的语句的标签。
它没有说任何关于"表达式语句"的内容。
我错过了什么,还是这只是一个不清楚/不正确的规范?
如果你更仔细地阅读JLS的第14章,你会发现LocalVariableDeclarationStatement不是Statement。他们不是很直观,是吗?
具体来说,在JLS 14.2中,我们看到:
- 一个块基本上由零个或多个块语句组成
- 块语句是以下之一:
- 局部变量声明语句
- 类声明
- 陈述
因此,LocalVariableDeclarationStatement 不是层次结构中 Statement 的后代,而是同级。它们都是 BlockStatement(块语句)的类型。
标签后面必须跟着一个 true 语句,即 BlockStatement 的特定子类型,它既不是 LocalVariableDeclarationStatement,也不是 ClassDeclaration。语句的各种子类型在 14.5 中列出。您不会在其中找到 LocalVariableDeclarationStatement,尽管您会发现 ExpressionStatement 是 StatementWithoutTrailingSubStatement 的子类型。