CodeGym /Java Blog /Random-IT /10 cose che devi sapere sul modificatore statico in Java
John Squirrels
Livello 41
San Francisco

10 cose che devi sapere sul modificatore statico in Java

Pubblicato nel gruppo Random-IT
In Java, il modificatore static significa che qualcosa è direttamente correlato a una classe: se un campo è statico, allora appartiene alla classe; se un metodo è statico, allora appartiene alla classe. Di conseguenza, è possibile utilizzare il nome della classe per chiamare un metodo statico o fare riferimento a un campo statico. Ad esempio, se il countcampo è statico nella Counterclasse, significa che puoi fare riferimento alla variabile con la seguente espressione: Counter.count. 10 cose che devi sapere sul modificatore statico in Java - 1Naturalmente, i modificatori di accesso devono essere considerati. Ad esempio, privatei campi sono disponibili solo all'interno della classe in cui sono dichiarati. E protectedi 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 Counterclasse abbia un increment()metodo statico il cui compito è incrementare il metodocountcampo. Per chiamare questo metodo, puoi usare Counter.increment(). Non è necessario creare un'istanza della Counterclasse 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 countvariabile statica sarà lo stesso per tutti Countergli 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.
  1. 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 mainmetodo è statico e la countvariabile non lo è, l'utilizzo del printlnmetodo all'interno del mainmetodo produrrà un "errore di compilazione".

  2. A differenza delle variabili locali, i campi e i metodi statici NON sono thread safein 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 corrette synchronizedper evitare problemi come race conditions.

  3. 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 factorymetodi e utilitymetodi. La java.lang.Mathclasse è un meraviglioso esempio: quasi tutti i suoi metodi sono statici. Le classi di utilità di Java sono contrassegnate finalper lo stesso motivo.

  4. Un altro punto importante è che non è possibile eseguire l'override ( @Override) dei metodi statici. Se dichiari un tale metodo in a subclass, cioè un metodo con lo stesso nome e la stessa firma, semplicemente "nascondi" il metodo di superclassinvece di sovrascriverlo. Questo fenomeno è noto come method 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 Caril metodo statico nella classe, poiché il metodo è stato chiamato in fase di compilazione. VehicleE nota che non ci sono stati errori di compilazione!

  5. 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'interno HashMap. 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 nostro Comparator, come un comparatore di età ( AgeComparator) nella Employeeclasse.

  6. 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, ExceptionInInitializerErrorsi 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 di NoClassDefFoundError, perché la classe non sarà in memoria quando vi si fa riferimento.

  7. È 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.

  8. 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 Singletonmodello. Se per qualche motivo non stai usando un Enumcome Singleton, 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.

  9. Durante la serializzazione, i campi statici, come transientle 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 è un int, il suo valore sarà zero dopo la deserializzazione. Se il suo tipo è float, il valore sarà 0.0. Se il campo è un Object, 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!

  10. Infine, parliamo di importazione statica. Questo modificatore ha molto in comune con l' importistruzione 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 esempio assertEquals()e le loro varianti sovraccaricate.

  11. È 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".

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION