2011-08-31 14 views
5

Perché le parentesi graffe non definiscono un ambito locale separato in Java? Mi aspettavo che questa fosse una caratteristica comune ai principali linguaggi di parentesi graffa (C, C++, Java, C#).scope locale in 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

possibile duplicato della [domanda sulla portata variabile e shadowing in java] (http://stackoverflow.com/questions/4623334/question-about-variable-scope-and-shadowing-in-java) – Thilo

risposta

16

Fanno definire un ambito locale separato, ma ancora non può mascherare variabili locali da un ambito genitore (ma è possibile di variabili di istanza ovviamente maschera).

Ma è possibile definire nuove variabili (con nomi diversi) e il loro ambito sarà limitato all'interno delle parentesi.

3

Le parentesi fanno oscillare la variabile ma qualsiasi cosa all'interno di un tutore può anche "vedere" più in alto il tutore. In tutti i casi che hai, mine è già definito come fido.

Per dirla in modo più sintetico. Anche i bambini hanno lo scopo dei loro genitori, ma non viceversa.

3

Definiscono un ambito locale separato, ma è un errore se una variabile locale ne nasconde un'altra.

Provare a definire una variabile (con un nome univoco) all'interno di un blocco, quindi accedere dall'esterno a quel blocco per verificare che abbia effettivamente ambito per il blocco e solo quel blocco.

13

Lo shadowing variabile locale è proibito in Java di proposito (see this answer).
L'idea è che questo aiuti a diminuire i bug.

+1

A una risposta breve con una motivazione merita un voto in rialzo. – H2ONaCl

2

I blocchi definiscono un ambito locale, ma non consentono di ridefinire una variabile con lo stesso nome di un'altra variabile in un ambito locale esterno. Se lo facesse, non ci sarebbe modo di accedere alla variabile "nascosta".

+0

+1 per "nessun modo di accedere alla variabile nascosta". In altri tipi di ombreggiamento è possibile aggirarlo (ad esempio 'this.foo'). – Thilo

2

Definisce un ambito locale ... le variabili dichiarate all'interno di parentesi graffe hanno l'ambito delle parentesi. Tuttavia, quello che stai cercando di fare è ridichiarare una variabile già esistente. A mio parere, non è Java che è sbagliato in questo caso, ma C++ per averlo permesso (presumo che sia ciò a cui stavi confrontando). Tuttavia, anche se la lingua lo permettesse, perché lo faresti? Scarsa leggibilità proprio lì, e possibile causa di errori.

-1

È dimenticato in Java, ma penso che Java sia sbagliato perché in TUTTI i linguaggi "strutturati" è autorizzato a farlo (non solo in C++ ma anche in Pascal, ADA, C e così via ...) e a volte vogliamo nascondere una variabile del blocco che racchiude.

+0

L'ombreggiamento delle variabili locali all'interno di un metodo porta a bug. – dolmen

0

Esegui questo e riceverai un errore che la variabile è già dichiarata come int i=5 e non è possibile ridefinire. Quindi, il genitore non prende mai ciò che ha avuto suo figlio. Quindi, cosa succede se il genitore sacrifica e rimuove la sua dichiarazione di 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++); 
    } 
} 

Ora, il genitore ha sacrificato la dichiarazione e entrambi i bambini si divertono e il codice viene eseguito correttamente.

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++); 
    } 
}