2010-11-22 6 views
18

Je travaille depuis longtemps avec Java mais je n'ai jamais rencontré ce genre de problème. Je voudrais savoir ce qu'il fait et pourquoi ce n'est pas une erreur.Bloc Java indépendant du code

public class Foo{ 

private int someVariable; 

{ 
    doSomething(); 
} 

public Foo(){ 
} 

private void doSomething(){ 
    // Something is done here 
} 

} 

Je voudrais savoir quel est le but du bloc individuel est qui contient un appel à « doSomething() ». C'est juste un code squelette. Le code que j'ai rencontré est http://www.peterfranza.com/2010/07/15/gwt-scrollpanel-for-touch-screens/

+0

Merci les deux u ... C'était vraiment utile ... était complètement paumé avant ... – Kasturi

Répondre

28

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 
+3

Notez qu'il fonctionne * avant * le code constructeur, donc ne dépendez pas des choses faites dans le (s) constructeur (s). –

7

C'est un bloc d'initialisation, qui est copié dans tous les constructeurs de la classe.