2010-07-02 6 views

Répondre

11

Si vous configurez seules les variables, les deux formes sont équivalentes (et vous devez utiliser l'ancien car il est plus lisible et succincte).

Le formulaire static {} existe pour les cas où vous devez également exécuter des instructions autres que des affectations de variables. (Un peu artificiel) exemple:

private static final int i; 
static { 
    establishDatabaseConnection(); 
    i = readIntFromDatabase; 
    closeDatabaseConnection(); 
} 
1

Oui, en utilisant la seconde méthode, vous pouvez utiliser un bloc try ... catch et réagir aux exceptions où, comme pour la première manière, les exceptions déclarées ne peuvent pas être interceptées. Il y a aussi une différence quand à la classe init, les champs et le bloc statique die sont exécutés mais je n'ai pas de détails, voir la spécification du langage sur l'instanciation de la classe pour plus d'informations.

Greetz, Ghad

1

Pour une variable primitive, rien. La différence peut être si l'initialisation n'est pas triviale, ou la méthode init/constructeur renvoie une exception vérifiée - alors vous avez besoin d'un bloc static pour pouvoir gérer l'exception.

2

La raison principale pour les blocs statiques est de pouvoir ajouter une certaine logique à l'initialisation que vous ne pouvez pas faire dans l'initialisation à 1 ligne, comme l'initialisation d'un tableau ou quelque chose.

1

Elles sont identiques, sauf que vous pouvez écrire plusieurs lignes dans le bloc de code statique.

Voir le official turorial de java.

1

Vous pouvez également utiliser l'initialisation avant Référence

public class ForwardReference { 
private static final int i = getValue(); 
private static final int j = 2; 
public static void main(String[] args) { 
    System.out.println(i); 
} 

private static int getValue() { 
    return j*2; 
} 

}

La clé ici est que nous obtenons la valeur de « j » de « getValue » avant « j » ont été déclarées. Les variables statiques sont initialisées dans l'ordre où elles apparaissent.

Cela affichera la valeur correcte de '4'

+0

C'est incroyable. Cependant, j'ai changé "j = 2" en "j = j()" et ajouté "static int j() {return 2;}". Avec ces changements ForwardReference imprimer '0'. Il semble donc y avoir certaines limites à la référence de renvoi. – emory

Questions connexes