这是我的理解。引用JAVA SE 7 规范的第 14 章:
14.2. 块
块是一系列语句、局部类声明和大括号内的局部变量声明语句。
Block:
{ BlockStatementsopt }
........
BlockStatement:
LocalVariableDeclarationStatement
ClassDeclaration
Statement
所以一个块总是在花括号中{ ... }
。
14.4. 局部变量声明语句
局部变量声明语句声明一个或多个局部变量名称。
LocalVariableDeclarationStatement:
LocalVariableDeclaration ;
LocalVariableDeclaration:
VariableModifiersopt Type VariableDeclarators
.......
VariableDeclarator:
VariableDeclaratorId
VariableDeclaratorId = VariableInitializer
…………
每个局部变量声明语句都立即包含在一个块中。局部变量声明语句可以与块中的其他类型的语句自由混合。
现在,“立即包含”是什么意思?
一些语句包含其他语句作为其结构的一部分;此类其他陈述是该陈述的子陈述。如果没有不同于 S 和 U 的语句 T 使得 S 包含 T 并且 T 包含 U,我们说语句 S 立即包含语句 U。以同样的方式,某些语句包含表达式(第 15 节)作为其结构的一部分。
让我们看看你的例子:
public class Test{
public void newMethod(){
if(true)int i=0;
}
}
在这种情况下,我们有以下块:
{
if(true)int i=0;
}
在这个块中,我们有一个If Statement
:
if(true)int i=0;
该语句又包含一个局部变量声明:
int i=0;
因此,违反了条件。回想一下:每个局部变量声明语句都立即包含在一个块中。但是,在这种情况下,局部变量声明包含在 If 语句中,该语句本身不是块,而是包含在另一个块中。因此,此代码无法编译。
唯一的例外是for
循环:
A local variable declaration can also appear in the header of a for statement (§14.14). In this case it is executed in the same manner as if it were part of a local variable declaration statement.
(您可能需要重读几次才能理解。)