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 me serais attendu à ce que cela donne une erreur de compilation car le 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, cela produit x y c g
également, pourquoi est- static { }
il appelé avant le constructeur de séquence?
la source
the code is copied into the beginning of each constructor of the class
- Ceci est une erreur. Disons que le constructeur commence parsuper("x ");
, le super constructeur s'exécutera avant tout bloc d'initialisation.Ce n'est pas une méthode mais un bloc d'initialisation .
Il sera exécuté avant l'appel du constructeur. Tandis que
est un 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 afin que le bloc d'initialisation statique soit exécuté
Sortie: x est imprimé
2. L'objet est créé afin que le bloc d'initialisation soit exécuté, puis le constucteur est appelé
Sortie: y est imprimé suivi de c
3. La méthode principale est invoquée qui à son tour appelle la méthode go
Sortie: g est affiché
Sortie finale: xycg
Cela pourrait aider http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
la source
C'est un bloc d'initialisation d'instance suivi d'un bloc d'initialisation statique .
est appelé lorsque vous créez une instance de la classe.
est appelée lorsque la classe est chargée par le chargeur de classe. Alors quand tu fais
la classe est chargée, donc elle s'exécute
static {}
, puis elle exécute le bloc d'initialisation de l'instance{}
, ensuite le corps du constructeur est appelé, puis la méthode sur l'instance nouvellement créée. Ergo la sortiex y c g
.la source
Est un bloc statique et est appelé pendant le chargement de classe
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.
la source
est un bloc d'initialisation partagé par la classe (comme indiqué par
static
), qui est exécuté en premier.est un bloc d'initialisation partagé par tous les objets (constructeurs) de la classe, qui vient ensuite.
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 fois que le constructeur est exécuté. C'est pourquoi "y" vient juste avant "c".
est juste une méthode d'instance associée à des objets construits à l'aide du constructeur ci-dessus, qui vient en dernier.
la source
Ces types de blocs sont appelés
initializer block
. Il est exécuté chaque fois que vous créez une instance d'un fichierclass
. Au moment de la compilation, ce code est déplacé dans chaque constructeur de votre classe.Où comme en cas de
static initializer
blocage: -il est exécuté une fois lorsque la classe est chargée. Nous utilisons généralement le
static
bloc d'initialisation lorsque l'initialisation d'unstatic
champ, nécessite plusieurs étapes.la source
Il est utilisé comme bloc d'initialisation et s'exécute après toute 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 .
la source
Static blocks
ne sont exécutées qu'une seule fois lorsque la classe est chargée et initialisée par le JRE.Et le
non-static
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
ainsi construit a été appelée après desnon-static
blocs, puis la méthode qui correspond réellement à votre objectif.la source