2012-07-22 8 views
23

Il codice nel seguente frammento funziona perfettamente. Conta il numero di oggetti creati utilizzando un campo statico di tipo int che è cnt.Un ciclo a linea singola con una coppia obbligatoria di parentesi graffe in 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"); 
    } 
} 

Visualizza l'output seguente.

Number of objects created : 10 

L'unica domanda è che quando si rimuove la coppia di parentesi graffe da quanto sopra for loop (vedere la commentata for loop), un errore di compilazione viene emesso indicando

non

un'istruzione .

Perché in questa particolare situazione, un paio di parentesi graffe è obbligatoria anche se il loop contiene solo una singola istruzione?

+4

'Main main = new Main();' è una dichiarazione, non una dichiarazione. – Mysticial

+0

@Mysticial: una dichiarazione con inizializzazione. Perché la parte di inizializzazione non è considerata una dichiarazione? – Razvan

+0

@Razvan Non vedo motivi tecnici per cui non possa. Quindi sembra essere una scelta di progettazione da Java, o C/C++ (dove Java ha ereditato gran parte della sua semantica di base). – Mysticial

risposta

28

Quando si dichiara una variabile (main in questo caso):

Main main = new Main(); 

non conta come una dichiarazione, anche se ha effetti collaterali. Per essere una dichiarazione corretta, si dovrebbe solo fare

new Main(); 

Allora, perché è

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

ammessi? { ... } è un blocco di codice e conta come una dichiarazione. In questo caso la variabile mainpotrebbe essere da utilizzare dopo la dichiarazione, ma prima della parentesi di chiusura. Alcuni compilatori ignorano il fatto che non è effettivamente utilizzato, altri compilatori emettono avvisi in merito.

+0

come 'Main main = new Main();' non conta come una dichiarazione, qual è il nome ufficiale in java? un'espressione? – Orup

+0

Si chiama dichiarazione variabile (con inizializzazione). – aioobe

+0

quindi una dichiarazione di variabile non è una dichiarazione in java? – Orup

3

Può avere senso creare un blocco di una riga con una nuova istruzione. Ciò che non ha senso è salvare un riferimento a un oggetto appena creato all'interno di un blocco a una riga, perché non è possibile accedere alla variabile principale dall'esterno dell'ambito.

Forse (solo la mia ipotesi) il compilatore ti costringe a digitare le parentesi esplicitamente perché tenere un riferimento non ha senso in quel caso, con la speranza che tu diventi consapevole del riferimento inutile.

3

for è definito come segue.

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

ForStatementNoShortIf: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) StatementNoShortIf 

ForInit: 
    StatementExpressionList 
    LocalVariableDeclaration 

ForUpdate: 
    StatementExpressionList 

StatementExpressionList: 
    StatementExpression 
    StatementExpressionList , StatementExpression 

Blocks sono definiti come segue.

Un blocco è una sequenza di istruzioni, dichiarazioni di classi locali e dichiarazioni di dichiarazione di variabili locali all'interno di parentesi graffe.

Block: 
{ BlockStatementsopt } 

BlockStatements: 
    BlockStatement 
    BlockStatements BlockStatement 

BlockStatement: 
    LocalVariableDeclarationStatement 
    ClassDeclaration 
    Statement 

Statements sono definiti come segue.

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 

In base alle specifiche, LocalVariableDeclarationStatement (consultare la sezione di blocco) non è valido, se non è dichiarata all'interno di un blocco. Pertanto, il seguente ciclo for segnala un errore in fase di compilazione "non una dichiarazione" come indicato nella domanda a meno che non si utilizzi un paio di parentesi graffe.

for (int a=0;a<10;a++) 
     Main main=new Main(); 
Problemi correlati