count
campo è statico nella Counter
classe, significa che puoi fare riferimento alla variabile con la seguente espressione: Counter.count
. Naturalmente, i modificatori di accesso devono essere considerati. Ad esempio, private
i campi sono disponibili solo all'interno della classe in cui sono dichiarati. E protected
i campi sono disponibili per tutte le classi all'interno di un pacchetto, così come per tutte le loro sottoclassi al di fuori del pacchetto. Supponiamo che la Counter
classe abbia un increment()
metodo statico il cui compito è incrementare il metodocount
campo. Per chiamare questo metodo, puoi usare Counter.increment()
. Non è necessario creare un'istanza della Counter
classe per accedere a un campo o metodo statico. Questa è la differenza fondamentale tra variabili e metodi statici (di classe) e variabili e metodi NON statici (di istanza). Una nota importante. Non dimenticare che i membri statici della classe appartengono direttamente alla classe, non a qualsiasi istanza della classe. Cioè, il valore della count
variabile statica sarà lo stesso per tutti Counter
gli oggetti. In questo articolo, esamineremo gli aspetti fondamentali dell'utilizzo del modificatore statico in Java, nonché alcune funzionalità che ti aiuteranno a comprendere i concetti chiave della programmazione.
Ciò che ogni programmatore dovrebbe sapere sul modificatore statico in Java.
In questa sezione esaminiamo gli aspetti principali dell'utilizzo di metodi, campi e classi statici. Partiamo dalle variabili.-
NON PUOI accedere a membri non statici di una classe all'interno di un contesto statico, come un metodo o un blocco statico. La compilazione del codice seguente genererà un errore:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
Questo è uno degli errori più comuni commessi dai programmatori Java, specialmente i neofiti. Poiché il
main
metodo è statico e lacount
variabile non lo è, l'utilizzo delprintln
metodo all'interno delmain
metodo produrrà un "errore di compilazione". -
A differenza delle variabili locali, i campi e i metodi statici NON sono
thread safe
in Java. In pratica, questa è una delle cause più frequenti di problemi di sicurezza nella programmazione multithread. Considerando che ogni istanza di una classe fa riferimento alla stessa copia di una variabile statica, tale variabile deve essere protetta o "bloccata" dalla classe. Pertanto, quando si utilizzano variabili statiche, assicurarsi che siano correttesynchronized
per evitare problemi comerace conditions
. -
I metodi statici hanno un vantaggio pratico in quanto non è necessario creare un nuovo oggetto ogni volta che si desidera chiamarli. Un metodo statico può essere chiamato utilizzando il nome della classe che lo dichiara. Ecco perché questi metodi sono perfetti per
factory
metodi eutility
metodi. Lajava.lang.Math
classe è un meraviglioso esempio: quasi tutti i suoi metodi sono statici. Le classi di utilità di Java sono contrassegnatefinal
per lo stesso motivo. -
Un altro punto importante è che non è possibile eseguire l'override (
@Override
) dei metodi statici. Se dichiari un tale metodo in asubclass
, cioè un metodo con lo stesso nome e la stessa firma, semplicemente "nascondi" il metodo disuperclass
invece di sovrascriverlo. Questo fenomeno è noto comemethod hiding
. Ciò significa che se un metodo statico viene dichiarato in entrambe le classi padre e figlio, il metodo chiamato sarà sempre basato sul tipo di variabile in fase di compilazione. A differenza dell'override del metodo, tali metodi non verranno eseguiti durante l'esecuzione del programma. Consideriamo un esempio:class Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the parent class / static method"); } } class Car extends Vehicle { public static void kmToMiles(int km) { System.out.println("Inside the child class / static method"); } } public class Demo { public static void main(String args []) { Vehicle v = new Car(); v.kmToMiles(10); } }
Uscita console:
All'interno della classe genitore/metodo statico
Il codice dimostra chiaramente che nonostante il fatto che l'oggetto sia un , viene chiamato
Car
il metodo statico nella classe, poiché il metodo è stato chiamato in fase di compilazione.Vehicle
E nota che non ci sono stati errori di compilazione! -
Inoltre, oltre alle classi di primo livello, puoi dichiarare le classi statiche. Tali classi sono note come
nested static classes
. Sono utili per fornire una migliore coesione. Un esempio lampante di una classe statica nidificata èHashMap.Entry
, che è una struttura dati all'internoHashMap
. Vale la pena notare che, come le classi interne, le classi nidificate statiche sono dichiarate in un file .class separato. Pertanto, se dichiari cinque classi nidificate nella tua classe principale, avrai 6 file con l'estensione .class. Un altro esempio è la dichiarazione del nostroComparator
, come un comparatore di età (AgeComparator
) nellaEmployee
classe. -
Il modificatore static può anche essere specificato in un blocco statico, meglio noto come "blocco di inizializzazione statica", che viene eseguito quando la classe viene caricata. Se non dichiari tale blocco, Java raccoglie tutti i campi statici in un unico elenco e li inizializza quando la classe viene caricata. Un blocco statico NON PUÒ generare eccezioni verificate, ma può generare eccezioni non verificate. In questo caso,
ExceptionInInitializerError
si verificherà un. In pratica, qualsiasi eccezione che si verifica durante l'inizializzazione dei campi statici verrà racchiusa in questo errore da Java. Questa è anche la causa più comune diNoClassDefFoundError
, perché la classe non sarà in memoria quando vi si fa riferimento. -
È utile sapere che i metodi statici sono collegati in fase di compilazione, a differenza del collegamento di metodi virtuali o non statici, che sono collegati in fase di esecuzione quando vengono chiamati su un oggetto reale. Di conseguenza, i metodi statici non possono essere sovrascritti in Java, poiché il polimorfismo non si applica ad essi in fase di esecuzione. Questa è una limitazione importante da considerare quando si dichiara un metodo static. Questa operazione ha senso solo quando non è possibile o necessario eseguire l'override del metodo in una sottoclasse. I metodi di fabbrica ei metodi di utilità sono buoni esempi di uso corretto del modificatore statico. Joshua Bloch sottolinea diversi vantaggi che i metodi di fabbrica statici hanno rispetto ai costruttori nel suo libro Effective Java, che è una lettura obbligatoria per ogni programmatore Java.
-
L'inizializzazione è un aspetto importante di un blocco statico. I campi statici o le variabili vengono inizializzati dopo che la classe è stata caricata in memoria. L'ordine di inizializzazione è dall'alto verso il basso, nello stesso ordine in cui sono dichiarati nel file sorgente della classe Java. Poiché i campi statici vengono inizializzati in modo thread-safe, questo processo viene utilizzato anche per implementare il
Singleton
modello. Se per qualche motivo non stai usando unEnum
comeSingleton
, allora hai una buona alternativa. Ma in questo caso, devi tenere conto che non si tratta di un'inizializzazione "pigra". Ciò significa che il campo statico verrà inizializzato anche PRIMA che qualcuno lo "chieda". Se un oggetto è pesante in termini di risorse o usato raramente, inizializzarlo in un blocco statico non funzionerà a tuo favore. -
Durante la serializzazione, i campi statici, come
transient
le variabili, non vengono serializzati. Infatti, se salvi dei dati in un campo statico, conterrà il suo valore iniziale (predefinito) dopo la deserializzazione. Ad esempio, se un campo statico è unint
, il suo valore sarà zero dopo la deserializzazione. Se il suo tipo èfloat
, il valore sarà 0.0. Se il campo è unObject
, il valore sarànull
. Ad essere onesti, questa è una delle domande più frequenti sulla serializzazione nelle interviste per le posizioni Java. Non archiviare dati di oggetti essenziali in un campo statico! -
Infine, parliamo di importazione statica. Questo modificatore ha molto in comune con l'
import
istruzione standard, ma è diverso in quanto consente di importare uno o tutti i membri della classe statica. Una volta importati i metodi statici, è possibile accedervi come se fossero dichiarati nella stessa classe. Allo stesso modo, importando campi statici, possiamo accedervi senza specificare il nome della classe. Questa funzione è apparsa in Java 1.5 e migliora la leggibilità del codice se utilizzata correttamente. Questo costrutto si trova più spesso nei test JUnit, poiché quasi tutti gli sviluppatori di test usano l'importazione statica per i metodi assert, ad esempioassertEquals()
e le loro varianti sovraccaricate. -
È tutto per ora. Ogni programmatore Java deve conoscere tutti gli aspetti del modificatore statico menzionato sopra. Questo articolo ha esaminato le informazioni di base su variabili statiche, campi, metodi, blocchi di inizializzazione e importazioni. Ha anche toccato alcune proprietà importanti che è essenziale conoscere per scrivere e comprendere i programmi Java. Spero che ogni sviluppatore perfezionerà il proprio uso abile dei membri statici, perché è molto importante per uno sviluppo software serio".
GO TO FULL VERSION