2010-06-17 11 views
7

Con mia grande sorpresa di questo codice funziona bene:Quando vengono dichiarati i riferimenti in un'istruzione switch?

int i = 2; 
switch(i) { 
case 1: 
    String myString = "foo"; 
    break; 
case 2: 
    myString = "poo"; 
    System.out.println(myString); 
} 

Ma non dovrebbe mai essere dichiarato il riferimento String? Potrebbe essere che tutte le variabili in ogni caso vengano sempre dichiarate indipendentemente da cosa, o come viene risolto?

+1

Non tutte le dichiarazioni fatte all'inizio del blocco {...} che le contengono? –

+0

Penso che Jules abbia ragione. Java ha ambiti statici in modo che il flusso di controllo non influisca sulla creazione (al contrario dell'inizializzazione) della variabile. Il posto in pila viene assegnato al momento dell'inserimento nel blocco di interruttori. Ma è ancora una specie di curiosità. GCC si rifiuta di compilare codice C equivalente per lo stesso (credo) stesso motivo per cui Java rifiuta di compilare 'if (someBool) String s =" foo ";' – musiKk

risposta

7

Bene, si tratta di parentesi (cioè lo scopo).

è meglio la pratica, senza dubbio, a scrivere le sue dichiarazioni in questo modo:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 
    case 2: { 
     myString = "poo"; 
     System.out.println(myString); 
    } 
} 

(io non sono in prossimità di un compilatore Java in questo momento, ma questo non dovrebbe compilare).

+0

Ho imparato qualcosa di nuovo oggi! –

+2

Infatti non si compila. – musiKk

+0

@musikk: Grazie per la conferma, spesso non sono contento che qualcosa non venga compilato :) –

3

L'ambito della dichiarazione myString è il blocco di commutazione (dove è {carattere). Se si dovesse scrivere in questo modo, la dichiarazione sarà per ogni caso:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 

    case 2: { 
     String myString = "poo"; 
     System.out.println(myString); 
    } 
} 
Problemi correlati