Il s'agit d'un bloc d'initialisation (non statique). Il est documenté dans le tutoriel officiel here:
Initialiser instance Membres
Normalement, vous mettriez du code pour initialiser une variable d'instance dans un constructeur. Il existe deux alternatives à l'utilisation d'un constructeur pour initialiser les variables d'instance: les blocs d'initialisation et les méthodes finales. blocs initialiseur pour les variables d'instance ressemblent à des blocs statiques initialiseur, mais sans le mot-clé statique:
{
// whatever code is needed for initialization goes here
}
Les copies du compilateur Java blocs initialiseur dans tous les constructeurs. Par conséquent, cette approche peut être utilisée pour partager un bloc de code entre plusieurs constructeurs.
Voici une démonstration simple:
public class Test {
{
System.out.println("Initializer block");
}
Test() {
System.out.println("Constructor 1");
}
Test(int i) {
System.out.println("Constructor 2");
}
public static void main(String[] args) {
new Test();
System.out.println("---");
new Test(1);
}
}
Sortie:
Initializer block
Constructor 1
---
Initializer block
Constructor 2
Vous trouverez peut-ce utile lorsque, par exemple l'ajout d'un JLabel
au panneau:
panel.add(new JLabel() {{ setBackground(Color.GREEN); setText("Hello"); }});
Sous le capot:
Le bytecode du bloc d'initialisation est littéralement copié dans chaque constructeur. (Au moins par Suns javac et le compilateur Eclipse:
Test();
Code:
0: aload_0
1: invokespecial
4: getstatiC#2;
7: ldC#3; //String "Initializer block"
9: invokevirtual #4; //Method PrintStream.println:(String;)V
12: getstatiC#2;
15: ldC#5;
17: invokevirtual #4;
20: return
Test(int);
Code:
0: aload_0
1: invokespecial #1;
4: getstatiC#2;
7: ldC#3; //String "Initializer block"
9: invokevirtual #4; //Method PrintStream.println:(String;)V
12: getstatiC#2;
15: ldC#6;
17: invokevirtual #4;
20: return
Merci les deux u ... C'était vraiment utile ... était complètement paumé avant ... – Kasturi