Questo è direttamente da http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Ordine di esecuzione
Guarda la seguente classe, sai quale viene eseguito per primo?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
Produzione:
inizializzatore statico chiamato
inizializzatore dell'istanza chiamato
chiamato dal costruttore
inizializzatore dell'istanza chiamato
chiamato dal costruttore
2. Come funzionano gli inizializzatori dell'istanza Java?
L'inizializzatore dell'istanza sopra contiene un'istruzione println. Per capire come funziona, possiamo considerarlo come un'istruzione di assegnazione variabile, ad es b = 0
. Questo può rendere più ovvio capire.
Invece di
int b = 0
, potresti scrivere
int b;
b = 0;
Pertanto, gli inizializzatori di istanza e gli inizializzatori di variabili di istanza sono praticamente gli stessi.
3. Quando sono utili gli inizializzatori di istanza?
L'uso degli inizializzatori di istanza è raro, ma può comunque essere una valida alternativa agli inizializzatori di variabili di istanza se:
- Il codice dell'inizializzatore deve gestire le eccezioni
- Eseguire calcoli che non possono essere espressi con un inizializzatore di variabili di istanza.
Naturalmente, tale codice potrebbe essere scritto nei costruttori. Ma se una classe avesse più costruttori, dovresti ripetere il codice in ciascun costruttore.
Con un inizializzatore di istanza, puoi semplicemente scrivere il codice una volta e verrà eseguito indipendentemente dal costruttore utilizzato per creare l'oggetto. (Immagino che questo sia solo un concetto e non viene usato spesso.)
Un altro caso in cui gli inizializzatori di istanze sono utili sono le classi interne anonime, che non sono in grado di dichiarare alcun costruttore. (Sarà un buon posto per posizionare una funzione di registrazione?)
Grazie a Derhein.
Si noti inoltre che le classi anonime che implementano le interfacce [1] non hanno costruttori. Pertanto sono necessari inizializzatori di istanze per eseguire qualsiasi tipo di espressione in fase di costruzione.
public static void staticMethod(){}
, se eseguiTestStatic.class.getMethod("staticMethod");
. L'inizializzatore statico non verrà richiamato. Maggiori informazioni qui docs.oracle.com/javase/specs/jvms/se10/html/…