Je regarde le code ci-dessous et j'ai trouvé quelque chose d'un peu étrange:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
Je m'attendais à ce que cela donne une erreur de compilation comme System.out
avec "y" n'appartient pas à une déclaration de méthode juste un { }
. Pourquoi est-ce valable? Je ne vois pas comment ce code serait ou devrait être appelé.
Lors de son exécution, il produit x y c g
aussi, pourquoi le static { }
être appelé avant le constructeur de séquence?
Cette:
static {
System.out.print("x ");
}
est un bloc d'initialisation statique , et est appelé lorsque la classe est chargée. Vous pouvez en avoir autant dans votre classe que vous le souhaitez, et ils seront exécutés par ordre d'apparition (de haut en bas).
Cette:
{
System.out.print("y ");
}
est un bloc d'initialisation , et le code est copié au début de chaque constructeur de la classe. Donc, si vous avez de nombreux constructeurs de votre classe, et qu'ils ont tous besoin de faire quelque chose de commun au début, vous n'avez qu'à écrire le code une fois et le mettre dans un bloc d'initialisation comme ça.
Par conséquent, votre sortie est parfaitement logique.
Comme Stanley commenté ci-dessous, voir la section du tutoriel Oracle décrivant les blocs d'initialisation pour plus d'informations.
Ce n'est pas une méthode mais un bloc d'initialisation .
{
System.out.print("y ");
}
Il sera exécuté avant l'appel du constructeur. Tandis que
static {
System.out.print("x ");
}
est le bloc d'initialisation statique qui est exécuté lorsque la classe est chargée par le chargeur de classe.
Ainsi, lorsque vous exécutez votre code
1. La classe est chargée par le chargeur de classe, donc le bloc d'initialisation statique est exécuté
Sortie: x est imprimé
2. L'objet est créé de sorte que le bloc d'initialisation est exécuté, puis le constructeur est appelé
Sortie: y est imprimé suivi de c
3. La méthode principale est invoquée, qui à son tour invoque la méthode go
Sortie: g est imprimé
Sortie finale: x y c g
Cela pourrait aider http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-Java/
C'est un bloc d'initialisation d'instance suivi d'un bloc d'initialisation statique.
{
System.out.print("y ");
}
est appelé lorsque vous créez une instance de la classe.
static {
System.out.print("x ");
}
est appelé lorsque la classe est chargée par le chargeur de classe. Alors quand tu fais
new Sequence().go();
la classe est chargée, donc elle exécute static {}
, puis il exécute le bloc d'initialisation d'instance {}
, le corps du constructeur est ensuite appelé, puis la méthode sur l'instance nouvellement créée. Supprimer la sortie x y c g
.
static {
System.out.print("x ");
}
Est un bloc statique et est appelé pendant le chargement de classe
{
System.out.print("y ");
}
Est un bloc d'initialisation
Vous pouvez avoir plusieurs blocs d'initialisation dans une classe, auquel cas ils s'exécutent dans l'ordre dans lequel ils apparaissent dans la classe.
Notez que tout bloc d'initialisation présent dans la classe est exécuté avant le constructeur.
static {
System.out.print("x ");
}
est un bloc d'initialisation partagé par la classe (comme indiqué par static
), qui est exécuté en premier.
{
System.out.print("y ");
}
est un bloc d'initialisation partagé par tous les objets (constructeurs) de la classe, qui vient ensuite.
Sequence() {
System.out.print("c ");
}
est un constructeur particulier pour la classe, qui est exécuté en troisième. Le bloc d'initialisation d'instance est appelé en premier à chaque exécution du constructeur. C'est pourquoi "y" vient juste avant "c".
void go() {
System.out.print("g ");
}
est juste une méthode d'instance associée à des objets construits à l'aide du constructeur ci-dessus, qui vient en dernier.
{
System.out.print("y ");
}
Ces types de blocs sont appelés initializer block
. Il est exécuté à chaque fois que vous créez une instance d'un class
. Au moment de la compilation, ce code est déplacé dans chaque constructeur de votre classe.
Où, comme dans le cas de static initializer
bloc: -
static {
System.out.println("x ");
}
il est exécuté une fois lorsque la classe est chargée. Nous utilisons généralement le bloc d'initialisation static
lorsque l'initialisation d'un champ static
nécessite plusieurs étapes.
Il est utilisé comme bloc d'initialisation et s'exécute après n'importe quel déclaration statique. Il pourrait être utilisé pour s'assurer que personne d'autre ne peut créer une instance de la classe (de la même manière que vous utiliseriez un constructeur privé) comme avec le modèle de conception Singleton.
static {
System.out.print("x ");
}
Static blocks
n'est exécuté qu'une seule fois lorsque la classe est chargée et initialisée par le JRE.
Et non-static
le bloc sera appelé chaque fois que vous créez une nouvelle instance et il sera appelé juste avant le constructeur.
Comme ici, vous n'avez créé qu'une seule instance de Sequence
donc construit a été appelé après non-static
bloque, puis la méthode qui fait votre objectif.