Lasciate esprimere un più chiaro esempio:
public class Test {
static {
System.out.println("static initializer");
}
{
System.out.println("instance initializer");
}
public Test() {
System.out.println("constructor");
}
}
e testare come segue:
public class Main {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
uscita:
static initializer
instance initializer
constructor
instance initializer
constructor
Gli inizializzatori statici vengono eseguite solo volta durante il runtime, in particolare durante il caricamento della classe. Gli inizializzatori dell'istanza vengono eseguiti durante ogni istanziazione prima del costruttore.
È possibile avere più di uno di essi e verranno eseguiti nell'ordine così come appaiono nella codifica.
Il vantaggio principale degli inizializzatori di istanza è che vengono eseguiti indipendentemente dal costruttore che si utilizza. Si applicano a ciascuno di essi in modo da non dover duplicare l'inizializzazione comune su tutti loro.
Il vantaggio principale degli inizializzatori statici è che vengono eseguiti una sola volta durante il caricamento di classe. Un esempio del mondo reale ben noto è il driver JDBC. Quando si esegue
Class.forName("com.example.jdbc.Driver");
che esegue solo le static
inizializzatori, allora qualsiasi (decente) driver JDBC si registrerà nel DriverManager
come segue
static {
DriverManager.registerDriver(new com.example.jdbc.Driver());
}
questo modo il DriverManager
può trovare il driver JDBC destro durante getConnection()
.
Quindi la parola chiave statica è facoltativa? – blackanchorage
quindi se si crea un blocco statico nel codice sopra, che eseguirà prima il blocco statico o il blocco di inizializzatore statico? .... si può spiegare cos'è l'inizializzatore statico? – Hariharbalaji
Non è sicuramente un inizializzatore 'static'. – BalusC