Java:标签后允许的语句

2022-09-02 21:44:04

我正在玩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只是说(在标签上)

标识符被声明为立即包含的语句的标签。

它没有说任何关于“表达式语句”的内容。

我是否错过了什么,或者这只是一个不清楚/不正确的规范?


答案 1

如果你更仔细地阅读 JLS 的第 14 章,你会发现 LocalVariable 声明语句不是语句。他们不是很直观,不是吗?

具体来说,在 JLS 14.2 中,我们看到:

  • 一个区块基本上由零个或多个区块声明组成
  • a 区块声明是以下之一:
    • 本地可变声明声明声明
    • 类声明
    • 陈述

因此,LocalVariable声明语句不是层次结构中语句的后代,而是同级。它们都是BlockStatements的类型。

标签后面必须跟有一个真正的语句,即 BlockStatement 的特定子类型,它既不是 LocalVariable声明Statement,也不是 ClassDeclaration。14.5 中列出了 Statement 的各种子类型。您不会在其中找到LocalVariableDeclarationStatement,尽管您会发现ExpressionStatement是DeprementWithoutTrailingSubstatement的子类型。


答案 2