我正在玩Java语法,所以这个问题纯粹来自于好奇心.这段代码:
http://www.google.com
Object val = 5 <- 4;
Run Code Online (Sandbox Code Playgroud)
并没有编译,因为一个标签(http)"必须紧跟声明".以下两个变体可以编译:
http://www.google.com
{ Object val = 5 <- 4; }
Run Code Online (Sandbox Code Playgroud)
和
Object val;
http://www.google.com
val = 5 <- 4;
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都从声明切换到表达式.这让我想知道Java中究竟是什么"声明",但是文档 指出:
除了表达式语句之外,还有另外两种语句:声明语句和控制流语句.声明语句声明一个变量.
该JLS只是说(标签),其
标识符被声明为直接包含的Statement的标签.
它没有说"表达式陈述".
我错过了什么,或者这只是一个不清楚/不正确的规范?
ysh*_*vit 20
如果您更仔细地阅读JLS的第14章,您会发现LocalVariableDeclarationStatement 不是 Statement.它们不是很直观,是吗?
具体来说,在JLS 14.2中,我们看到:
因此,LocalVariableDeclarationStatement不是层次结构中Statement的后代,而是兄弟.它们都是BlockStatements的类型.
标签后面必须跟一个true语句 - 也就是BlockStatement的特定子类型既不是LocalVariableDeclarationStatement也不是ClassDeclaration.Statement的各种子类型列于14.5.您不会在其中找到LocalVariableDeclarationStatement,但您会发现ExpressionStatement是StatementWithoutTrailingSubstatement的子类型.