以下代码段中的代码运行正常。它计算使用类型int
的静态字段cnt
创建的对象数。
public class Main
{
private static int cnt;
public Main()
{
++cnt;
}
public static void main(String[] args)
{
for (int a=0;a<10;a++)
{
Main main=new Main();
}
/*for (int a=0;a<10;a++)
Main main=new Main();*/
System.out.println("Number of objects created : "+cnt+"\n\n");
}
}
显示以下输出。
Number of objects created : 10
唯一的问题是,当我从上面的for
循环中删除一对大括号时(请参阅注释的for
循环),会发出编译时错误,指示
不是声明。
为什么在这种特殊情况下,即使循环只包含单个语句,一对大括号强制?
答案 0 :(得分:28)
声明变量(在这种情况下为main
)时:
Main main = new Main();
即使它有副作用,也不算作声明。因为它是一个恰当的陈述,你应该做
new Main();
为什么
... {
Main main = new Main();
}
允许? { ... }
是一段代码, 计为一个语句。在这种情况下,main
变量可以在声明之后但在结束括号之前使用。有些编译器忽略了它确实没有被使用的事实,其他编译器也会发出警告。
答案 1 :(得分:3)
使用新语句创建单行块是有意义的。没有意义的是在单行块中保存对刚创建的对象的引用,因为您无法从for scope范围外访问变量main。
也许(只是我的猜测)编译器会强制您明确键入括号,因为在这种情况下保持引用没有意义,希望您能够意识到无用的引用。
答案 2 :(得分:3)
for
定义如下。
BasicForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement ForStatementNoShortIf: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf ForInit: StatementExpressionList LocalVariableDeclaration ForUpdate: StatementExpressionList StatementExpressionList: StatementExpression StatementExpressionList , StatementExpression
Blocks定义如下。
块是一系列语句,本地类声明和 大括号内的局部变量声明语句。
Block: { BlockStatementsopt } BlockStatements: BlockStatement BlockStatements BlockStatement BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statement
Statements定义如下。
Statement: StatementWithoutTrailingSubstatement LabeledStatement IfThenStatement IfThenElseStatement WhileStatement ForStatement StatementWithoutTrailingSubstatement: Block EmptyStatement ExpressionStatement AssertStatement SwitchStatement DoStatement BreakStatement ContinueStatement ReturnStatement SynchronizedStatement ThrowStatement TryStatement StatementNoShortIf: StatementWithoutTrailingSubstatement LabeledStatementNoShortIf IfThenElseStatementNoShortIf WhileStatementNoShortIf ForStatementNoShortIf
根据规范,LocalVariableDeclarationStatement
(查看块部分)无效,如果它未在块中声明。因此,除非您使用一对大括号,否则以下for
循环会报告您在问题中提到的编译时错误“ not a statement ”。
for (int a=0;a<10;a++)
Main main=new Main();