2015-07-24 21 views
12

Quando sto solo cercando di fare un po 'il programma in Java .I cercare di utilizzare final variabile, so che final variabile deve essere inizializzata al momento della dichiarazione, ma dentro il metodo principale che accetta la variabile final con l'inizializzazione fuori . Non so qual è il motivo. Nessuno mi dice il motivo.Perché la variabile finale non richiede l'inizializzazione nel metodo principale in java?

Grazie codice

:

class name 
{ 
    final int b; //here shows error 
    public static void main(String args[]) 
    { 
     final int a; // here no error... why? 
     System.out.println("hai"); 
    } 
} 
+2

Mostraci il codice in modo che possiamo aiutarvi –

+0

Puoi condividere il tuo codice – MMMMS

+0

@DavideLorenzoMARINO controllare il mio aggiornamento – KVK

risposta

10

Ad esempio livello variabile

  • Una variabile finale può essere inizializzato solo una volta.

  • Una variabile finale a livello di classe deve essere inizializzata prima della fine del costruttore.

Per locale (metodo) livello

  • Una variabile finale a livello metodo può essere inizializzata solo una volta.
  • Deve essere inizializzato prima di essere utilizzato

Quindi, in pratica, se non si utilizza una variabile finale locale, si può anche saltare è l'inizializzazione.

Se la variabile è a livello di istanza, è necessario inizializzarla nella definizione o nel corpo del costruttore.

Nel codice è presente una variabile di istanza final int b che non è mai stata inizializzata in modo da avere un errore.

Hai anche una variabile locale final int a che non viene mai utilizzata. Quindi non hai un errore per quella variabile.

+1

ok grazie per la spiegazione – KVK

2

La risposta viene fornita in JLS.

Una variabile può essere dichiarata finale. Una variabile finale può essere assegnata solo una volta. Si tratta di un errore in fase di compilazione se viene assegnata una variabile finale a meno che non sia definitivamente assegnata immediatamente prima dell'assegnazione.

What is definitive assignment

Ora, in caso di una variabile locale, è portata è valido all'interno del blocco è dichiarata. E il flusso sarà lineare (dall'alto verso il basso). Quindi il compilatore può identificare facilmente dove inizialmente verrà inizializzata la variabile.

Ma nel caso di un field, è impossibile trovare quale metodo assegnerà prima la variabile a meno che non sia assegnata in un Constructor.

Pertanto, è necessario assegnare final fieldsdurante la dichiarazione o in un Costruttore.

1

variabile locale non ha alcun valore di default a destra, bt possiamo dichiarare come questo

finale int a; non ci sono errori ma non possiamo accederci. quando proviamo ad accedervi, allora si verifica un errore. Ma questo caso non è per la variabile di classe.

Quindi nel tuo caso quando accedi a stampare il valore di una variabile, si verifica un errore. Grazie