2011-08-31 16 views
5

¿Por qué las llaves no definen un alcance local separado en Java? Esperaba que fuera una característica común a los principales idiomas de llaves (C, C++, Java, C#).alcance local en Java

class LocalScopeTester 
{ 
    public static void main(String... args) 
    { 
     Dog mine = new Dog("fido"); 
     if (mine.getName().equals("ace")) 
     { 
      Dog mine = new Dog("spot"); // error: duplicate local 
     } 
     else 
     { 
      Dog mine = new Dog("barkley"); // error: duplicate local 
      { 
       Dog mine = new Dog("boy"); // error: duplicate local 
      } 
     } 
    } 
} 
+0

posible duplicado de [pregunta sobre alcance variable y sombreado en java] (http://stackoverflow.com/questions/4623334/question-about-variable-scope-and-shadowing-in-java) – Thilo

Respuesta

16

que hacen definir un ámbito local separado, pero todavía no pueden enmascarar las variables locales de un ámbito primario (pero puedes curso de variables de instancia máscara).

Pero puede definir nuevas variables (con diferentes nombres) y su alcance se limitará a las llaves.

3

Las abrazaderas abarcan la variable, pero cualquier cosa dentro de una abrazadera también puede "ver" más arriba de la abrazadera. En todos los casos que tiene, mine ya está definido como fido.

Para decirlo de manera más sucinta. Los niños también tienen acceso a sus padres, pero no al revés.

3

Definen un alcance local separado, solo es un error si una variable local oculta a otra.

Intenta definir una variable (con un nombre único) dentro de un bloque, luego accediendo desde fuera de ese bloque para ver que de hecho está limitado al bloque, y solo ese bloque.

13

El sombreado de variable local está prohibido en Java a propósito (see this answer).
La idea es que esto ayude a disminuir los errores.

+1

A una respuesta corta con una justificación merece un voto positivo. – H2ONaCl

2

Los bloques definen un ámbito local, pero no le permiten redefinir una variable con el mismo nombre que otra variable en un ámbito local externo. Si lo hiciera, no habría forma de acceder a la variable "oculta".

+0

+1 para "no hay forma de acceder a la variable oculta". En otros tipos de sombreado puede evitarlo (como 'this.foo'). – Thilo

2

Define un ámbito local ... las variables declaradas dentro de las llaves tienen el alcance de las llaves. Sin embargo, lo que intenta hacer es redeclarar una variable ya existente. En mi opinión, no es Java lo que está mal en este caso, sino C++ por dejar que lo hagas (supongo que eso es lo que lo estabas comparando). No obstante, incluso si el lenguaje lo permite, ¿por qué lo harías? Poca legibilidad allí, y posible causa de errores.

-1

Se olvidó en Java pero creo que Java está mal porque en TODOS los lenguajes "estructurados en bloque" está autorizado para hacer esto (no solo en C++ sino también en Pascal, ADA, C, etc.) y en algún momento queremos ocultar una variable del bloque adjunto.

+0

Sombrear variables locales dentro de un método conduce a errores. – dolmen

0

Ejecutar esto y obtendrá un error que la variable ya está declarada como int i=5 y no se puede redefinir. Entonces, el padre nunca toma lo que obtuvo su hijo. Entonces, ¿qué pasa si el padre sacrifica y elimina su declaración de int i=5?

public class Ouch { 
    public static void main(String[] args) { 

     int i=5; 

     for(int i=0;i<5;i++); 
     for(int i=0;i<5;i++); 
    } 
} 

Ahora, el padre sacrificó su declaración y ambos disfrutan y el código se ejecuta con éxito.

public class Ouch { 
    public static void main(String[] args) { 

     //int i=5; 

     for(int i=0;i<5;i++); 
     for(int i=0;i<5;i++); 
    } 
}