2016-07-11 77 views
5

Quindi sappiamo che una variabile locale deve essere inizializzata per poter essere usata nel costrutto if-else-if. Ad esempio, il seguente codice non verrà compilato.Perché una variabile locale viene avviata nei costrutti if-else ma non nei costrutti if-else-if?

public class Test { 
    public static void main (String...args){ 
     double price= 11; 
     String model ; 
     if (price>10) 
     {model ="smartphone";} 
     else if (price<=11) 
     {model="not smart phone";} 
     System.out.println(model); 
    } 
} 

Ma, se si cambia else if (price<=11)-else o inizializzate la modello locale String variabile per un valore casuale, il codice verrà compilato con successo. La mia domanda in questo caso è "perché?"

Ora, questa era una domanda da un libro e la spiegazione è stata:.

"il modello variabile locale viene dichiarata solo, non inizializzata L'inizializzazione del modello variabile è collocato all'interno del se e else-if costrutti: se si inizializza una variabile all'interno di un costrutto if o else-if, il compilatore non può essere sicuro se queste condizioni verranno valutate come vere, con conseguente non inizializzazione della variabile locale. "

Anche dopo la spiegazione, io ancora non ho capito due cose,

  1. io non sono sicuro perché il modello variabile sarà confondere il compilatore, dal momento che doppia il prezzo è 11 indipendentemente da ciò che il modello è.
  2. Come si inizializza magicamente la variabile locale quando si inserisce altro alla fine?
+0

'prezzo' è una variabile e come tale il suo valore potrebbe essere' variabile'. Quindi, nel tuo codice, non vi è alcuna garanzia che "if" o "else if" vengano immessi in –

+0

l'ultima condizione if non possa riuscire su 11.5 e poiché non esiste nessun altro modello non verrà inizializzato, –

+0

@ Joop per 11,5, sicuramente la prima condizione è soddisfatta. Tuttavia, fallirebbe per NaN. –

risposta

11

model devono essere inizializzati prima dell'istruzione System.out.println(model); affinché il codice passi la compilazione.

  1. Il compilatore non analizza le condizioni del if-else-if per determinare se sarà sempre incontrato uno di loro, quindi non può essere sicuri che sia il caso o blocchi else-if vengono sempre eseguiti e, pertanto, non è possibile verificare che model venga inizializzato prima dell'istruzione .

  2. Quando si utilizza un costrutto if-else, sia il caso o il blocco else sarebbe stato giustiziato, in modo da quando entrambi inizializzare model, è garantito di essere inizializzato prima della dichiarazione println.