2012-07-22 18 views
23

El código en el siguiente fragmento funciona bien. Cuenta el número de objetos creados usando un campo estático de tipo int que es cnt.Un bucle de una sola línea con un par obligatorio de llaves en 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"); 
    } 
} 

Muestra la siguiente salida.

Number of objects created : 10 

La única cuestión es que cuando se quita el par de llaves de la for bucle anteriormente (véase el for bucle comentado), se emite un error de tiempo de compilación que indica

no

una declaración .

¿Por qué en esta situación particular, un par de llaves es obligatoria a pesar de que el bucle incluye solamente una sola declaración?

+4

'Principal main = new Main();' es una declaración, no una declaración. – Mysticial

+0

@Mysticial: una declaración con inicialización. ¿Por qué la parte de inicialización no se considera una declaración? – Razvan

+0

@Razvan No veo ninguna razón técnica por la que no pueda. Por lo tanto, parece ser una elección de diseño de Java o C/C++ (donde Java heredó gran parte de su semántica básica). – Mysticial

Respuesta

28

Cuando se declara una variable (main en este caso):

Main main = new Main(); 

que no cuenta como una declaración, incluso si tiene efectos secundarios. Para que sea una declaración apropiada, sólo debe hacer

new Main(); 

¿Por qué es

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

permitido? { ... } es un bloque de código, y hace cuenta como una declaración. En este caso, la variable mainpodría ser después de la declaración, pero antes de la llave de cierre. Algunos compiladores ignoran el hecho de que de hecho no se usa, otros compiladores emiten advertencias con respecto a esto.

+0

como 'Main main = new Main();' no cuenta como una declaración, ¿cuál es el nombre oficial para ella en java? una expresión? – Orup

+0

Se llama declaración de variable (con inicialización). – aioobe

+0

por lo que una declaración de variable no es una declaración en java? – Orup

3

Puede tener sentido crear un bloque de una línea con una nueva instrucción. Lo que no tiene sentido es guardar una referencia a un objeto recién creado dentro de un bloque de una línea, porque no puede acceder a la variable principal desde fuera del ámbito.

Tal vez (solo mi conjetura) el compilador te obliga a escribir los corchetes explícitamente porque mantener una referencia no tiene sentido en ese caso, con la esperanza de que te des cuenta de la referencia inútil.

3

for se define de la siguiente manera.

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

ForStatementNoShortIf: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) StatementNoShortIf 

ForInit: 
    StatementExpressionList 
    LocalVariableDeclaration 

ForUpdate: 
    StatementExpressionList 

StatementExpressionList: 
    StatementExpression 
    StatementExpressionList , StatementExpression 

Blocks se definen como sigue.

Un bloque es una secuencia de declaraciones, declaraciones de clases locales y declaraciones de declaración de variables locales entre llaves.

Block: 
{ BlockStatementsopt } 

BlockStatements: 
    BlockStatement 
    BlockStatements BlockStatement 

BlockStatement: 
    LocalVariableDeclarationStatement 
    ClassDeclaration 
    Statement 

Statements se definen como sigue.

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 

De acuerdo con la especificación, LocalVariableDeclarationStatement (ver la sección de bloque) no será válido, si no se declara dentro de un bloque. Por lo tanto, el siguiente bucle for informa un error en tiempo de compilación "no una declaración" como mencionó en su pregunta a menos que use un par de llaves.

for (int a=0;a<10;a++) 
     Main main=new Main(); 
Cuestiones relacionadas