quando viene caricata una variabile statica in java, runtime o tempo di compilazione?

Quando viene caricata una variabile statica, tempo di esecuzione o tempo di compilazione? Qualcuno può spiegarlo per favore.

Apprezzerei davvero l’aiuto.

Grazie.

Sono caricati in fase di esecuzione.

Statico significa che la variabile appartiene alla class e non alle istanze della class. Quindi esiste un solo valore per ogni variabile statica e non n valori se si hanno n istanze della class.

Il compilatore ottimizza i campi finali statici inlinea incorporando il valore nel bytecode invece di calcolare il valore in fase di esecuzione.

Quando si triggers una JVM e si carica una class per la prima volta (questa operazione viene eseguita dal classloader quando la class viene prima referenziata in qualsiasi modo), eventuali blocchi o campi statici vengono “caricati” nella JVM e diventano accessibili.

Una dimostrazione:

public class StaticDemo { // a static initialization block, executed once when the class is loaded static { System.out.println("Class StaticDemo loading..."); } // a constant static final long ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000; // a static field static int instanceCounter; // a second static initialization block // static members are processed in the order they appear in the class static { // we can now acces the static fields initialized above System.out.println("ONE_DAY_IN_MILLIS=" + ONE_DAY_IN_MILLIS + " instanceCounter=" + instanceCounter); } // an instance initialization block // instance blocks are executed each time a class instance is created, // after the parent constructor, but before any own constructors (as remarked by Ahmed Hegazy) { StaticDemo.instanceCounter++; System.out.println("instanceCounter=" + instanceCounter); } public static void main(String[] args) { System.out.println("Starting StaticDemo"); new StaticDemo(); new StaticDemo(); new StaticDemo(); } static { System.out.println("Class StaticDemo loaded"); } } 

Produzione:

 Class StaticDemo loading... ONE_DAY_IN_MILLIS=86400000 instanceCounter=0 Class StaticDemo loaded Starting StaticDemo instanceCounter=1 instanceCounter=2 instanceCounter=3 

Si noti come ‘Starting StaticDemo’ non appare come prima riga di output. Questo perché la class deve essere caricata prima che il metodo principale possa essere eseguito, il che significa che tutti i campi e i blocchi statici vengono elaborati in ordine.

tempo di esecuzione quando viene caricata la class. – Dai un’occhiata all’inizializzazione

I campi statici vengono caricati quando la class viene caricata. Questo di solito accade quando viene creato l’object file di una class, ma può essere precedente se la class viene utilizzata in un altro modo.

L’inizializzatore statico è thread-safe e puoi accedere alla class in più thread in modo sicuro. Questo è utile come modo per creare un singleton thread-safe senza dover usare un lock.

Nota: è ansible caricare la class (e il relativo blocco di intializzazione statico eseguito più volte) se vengono utilizzati più programmi di caricamento class. Generalmente, caricare la stessa class in caricatori di classi multiple può essere fonte di confusione e viene evitato, ma è supportato e funziona.

Come caricheresti una variabile al momento della compilazione? La variabile viene inizializzata quando viene caricata la class corrispondente. Vedi il JVMS .

Il caricamento è un’operazione di runtime. Tutto è caricato in fase di runtime.

Quando si digita java ClassName class carica in JVM con variabili statiche, quindi non è necessario un object per esso.

Dove come variabile di istanza caricata da JVM quando viene creato l’object.