2010-01-18 10 views
9

Tranne l'ambito e le differenze di archiviazione, ci sono altre importanti differenze tra istanza e variabili locali in java?Qual è la differenza tra le variabili locali e di istanza in Java

+0

Dup? http://stackoverflow.com/questions/1794141/java-instance-variables-vs-local-variables –

+3

"tranne le differenze, quali sono le differenze?" :-) Che tipo di differenze stai cercando? ottimizzazioni e durata della vita o qualcos'altro? – Fredrik

risposta

23

Una cosa in più che posso pensare:

variabili di istanza sono dati i valori di default, cioè nullo se si tratta di un riferimento a un oggetto, 0 se si tratta di un int.

Le variabili locali non ricevono valori predefiniti e pertanto devono essere inizializzate in modo esplicito (e il compilatore di solito si lamenta se non si riesce a farlo).

7

No, lo hai praticamente coperto. Una variabile di istanza appartiene a un'istanza di una classe, una variabile locale appartiene a uno stack frame.

Le variabili di istanza sono inizializzate su valori predefiniti, ma in genere è buona norma utilizzare comunque inizializzazioni esplicite.

33

Le principali differenze che vedo sono nel loro:

Ambito: Le variabili locali sono visibili solo nel metodo o il blocco sono dichiarate, mentre le variabili di istanza possono essere viste da tutti i metodi della classe.

Luogo in cui sono dichiarate: Le variabili locali sono dichiarate all'interno di un metodo o di un blocco, mentre le variabili di istanza all'interno di una classe, ma al di fuori di un metodo.

tempo dell'esistenza: variabili locali vengono create quando viene chiamato un metodo e distrutte quando il metodo termina mentre le variabili di istanza vengono creati utilizzando nuovo e distrutto dal garbage collector quando non ci sono riferimento ad esse.

Accesso: Non è possibile accedere alle variabili locali mentre è possibile accedere alle variabili di istanza se sono dichiarate come pubbliche.

Dove vengono dichiarati: Le variabili locali vengono dichiarate in un metodo o in un blocco prima di essere richiamate, mentre le variabili di istanza possono essere dichiarate ovunque nel livello di classe (anche dopo il loro utilizzo).

EDIT:

E ho dimenticato di dire che le variabili di istanza sempre avere un valore, anche se non è assegnato dal codice (allora dovranno ad esempio nullo, 0, 0.0, false). Per le variabili locali ci deve essere un valore assegnato dal codice, altrimenti il ​​compilatore genera un errore.

+0

Cosa intendi per differenza tra "Scope" e "Existence time" e "Dove vengono dichiarati"? Inoltre, non capisco il significato della sezione "accesso" - cosa significherebbe "accedere" a un locale? – danben

+0

@danben: l'accesso non ha senso per una variabile locale. ecco perché è una differenza dalle variabili di istanza. Sono d'accordo è una differenza banale, ma ancora ...! lo stesso vale per "Dove vengono dichiarati". Per quanto riguarda l'ambito e il tempo di esistenza (o durata), sono termini completamente diversi.E ho anche dimenticato di aggiungere un altro, che modificherò e aggiungerò ora. – Alex

0

La differenza principale è che le variabili di istanza ottengono valori predefiniti come il valore int get zero char ottiene null ma non le variabili locali. È possibile lasciare una variabile di istanza non inizializzata, ma in cui le variabili locali devono essere inizializzate altrimenti si otterrà l'errore del compilatore.

7

Un'altra differenza, non devi preoccuparti dell'accesso simultaneo alle variabili locali; mentre lo fai con le variabili di istanza in un ambiente multi-thread.

1

A prescindere da tutto ciò che è già menzionato qui, vorrei sottolineare che le variabili locali sono un po 'più veloci per accedere alla JVM. La JVM ha più lavoro da fare per leggere o scrivere una variabile di istanza rispetto a una variabile locale.Ciò è ancora vero per il server Hotspot corrente JVM perché non è un problema di ottimizzazione della VM, è piuttosto causato dal fatto che una variabile di istanza è visibile al di fuori del metodo e potrebbe quindi essere accessibile da altri thread mentre il metodo viene eseguito.

+0

Potete fornire riferimenti che dimostrino che ciò è vero? Dubito che abbia letto una variabile locale finale più veloce del campo dell'istanza finale. – user2418306

0

Le variabili definite all'interno di metodi, costruttori o blocchi sono denominate variabili locali. La variabile verrà dichiarata e inizializzata all'interno del metodo e verrà distrutta al completamento del metodo.

Le variabili di istanza sono variabili all'interno di una classe ma all'esterno di qualsiasi metodo. Queste variabili vengono istanziate quando la classe viene caricata.

+0

Le variabili di istanza vengono create un'istanza quando viene costruita un'istanza della classe. – EJP

2

variabile locale:

  • è dichiarata all'interno di un metodo/costruttore oppure in un blocco (racchiusa tra parentesi)
  • deve essere inizializzato prima dell'uso, altrimenti non si compila.

variabile istanza:

  • è dichiarata all'interno di una classe.
  • inizializzazione non è obbligatoria: se omesso, contiene il valore di default (0, 0,0, false, null, ecc)
1

parte tutte le differenze sopra menzionate, desidero sottolineare ancora una differenza le variabili di istanza possono avere modificatori di accesso (come privati, pubblici, protetti ecc.), ma le variabili locali non avranno alcun modificatore di accesso.

0

Le variabili locali sono dichiarate all'interno di un metodo.

Le variabili di istanza sono dichiarate all'interno di una classe ma non all'interno di un metodo.

Le variabili locali non ricevono un valore predefinito. Il compilatore si lamenta se si tenta di utilizzare una variabile locale prima che la variabile venga inizializzata.

Tuttavia, le variabili di istanza ottengono sempre un valore predefinito. Se non si assegna esplicitamente un valore a una variabile di istanza, la variabile di istanza ha ancora un valore.

interi 0

punti galleggianti 0

booleani falsi

riferimenti nulli

Problemi correlati