2012-07-22 38 views
23

以下代碼片段中的代碼工作得很好。它計算使用int類型的靜態字段cnt創建的對象數。在Java中使用一對強制的大括號的單行循環

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環),一個編譯時錯誤發出指示

不是一個語句。

爲什麼在這種特殊情況下,一對大括號是強制性即使環路只包含一個語句

+4

'Main main = new Main();'是一個聲明,而不是一個語句。 – Mysticial 2012-07-22 17:43:29

+0

@Mysticial:一個帶初始化的聲明。爲什麼初始化部分不是一個聲明? – Razvan 2012-07-22 17:50:26

+0

@Razvan我看不出沒有技術上的原因。所以它似乎是來自Java或C/C++(其中Java繼承了其大部分基本語義)的設計選擇。 – Mysticial 2012-07-22 17:52:58

回答

28

當你聲明一個變量(main在這種情況下):

Main main = new Main(); 

它不能算作一份聲明,即使它有副作用。對於這是一個正確的說法,應該只是做

new Main(); 

那麼,爲什麼

... { 
    Main main = new Main(); 
} 

允許嗎? { ... }是一段代碼,而確實是算作一條語句。在這種情況下main變量可能在聲明後,但在大括號之前使用。有些編譯器忽略了它確實沒有使用的事實,其他編譯器會發出警告。

+0

as'Main main = new Main();'不算作聲明,它在java中的官方名稱是什麼?一個表達? – Orup 2014-12-23 23:40:48

+0

它被稱爲變量聲明(帶初始化)。 – aioobe 2014-12-23 23:43:53

+0

所以變量聲明不是java中的語句? – Orup 2014-12-23 23:47:57

3

用新語句創建單行塊是有意義的。沒有意義的是在單行塊內保存對剛剛創建的對象的引用,因爲你不能從範圍外訪問變量main。

也許(只是我的猜測)編譯器迫使你明確鍵入括號,因爲在這種情況下保持引用沒有意義,希望你能意識到無用的引用。

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循環會報告編譯時錯誤「」,而不是您的問題中提到的語句

​​
相關問題