Maison >Java >javaDidacticiel >Description détaillée de l'ordre d'initialisation et d'exécution des membres statiques, des blocs de code statiques, des membres ordinaires, des blocs de code ordinaires et des méthodes de constructeur des classes Java

Description détaillée de l'ordre d'initialisation et d'exécution des membres statiques, des blocs de code statiques, des membres ordinaires, des blocs de code ordinaires et des méthodes de constructeur des classes Java

高洛峰
高洛峰original
2017-03-19 11:20:102144parcourir

Aujourd'hui, j'ai lu "Java Programmation Pensées (4e édition chinoise)" et je viens de revoir le point de connaissance de l'initialisation des membres dans une classe. Afin d'approfondir l'impression et de donner une référence aux autres, référez-vous aux exemples du livre et modifiez-les pour obtenir le code suivant :

Nom du fichier : HelloWorld.java

Nom du package : main

package main;
class Bowl {
    Bowl(int marker){
        System.out.println("Bowl("+marker+")");
    }
    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}
class Table{
    static Bowl bowl1 = new Bowl(1); 
    public Table() {
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2 (int marker){
        System.out.println("f2("+marker+")");
    }
    static Bowl bowl2 = new Bowl(2); 
}
class Cupboard{
    {
        System.out.println("Cupboard类普通代码块执行");
    }
    Bowl bowl3 = new Bowl(3); // 注意,此处不是静态成员
    static Bowl bowl4 = new Bowl(4);
    static{
        System.out.println("Cupboard类静态代码块执行");
    }
    public Cupboard() {
        // TODO Auto-generated constructor stub
        System.out.println("Cupboard()");
        bowl4.f1(2);
    }
    void f3(int marker){
        System.out.println("f3("+marker+")");
    }
    static Bowl bowl5 = new Bowl(5);
}
public class HelloWorld  {
   public static void main(String args[]){
       System.out.println("Creating new Cupboard() in main");
       new Cupboard();
       table.f2(1);
       cupboard.f3(1);
   }
   static Table table = new Table();
   static Cupboard cupboard = new Cupboard();
}

Analysons le fonctionnement de ce programme.

1. Tout d'abord, si la machine virtuelle Java veut exécuter la méthode principale, elle doit d'abord charger la classe HelloWorld

2. On constate que la classe HelloWorld contient des données statiques (uniquement statiques). membres) et commence à initialiser les membres statiques
First
【1】 static Table table = new Table(); La classe Table doit donc être chargée. On constate que la classe contient des membres statiques, et les opérations d'initialisation sont effectuées selon la séquence définie
【2】static Bowl bowl1 = new Bowl(1); Sortie : Bowl(1)
【3】 static Bowl bowl2 = new Bowl( 2); Sortie : Bowl(2)
【4】ConstructeurTable(), sortie : Table() et f1(1)

Deuxièmement
【1】 static Cupboard cupboard = new Cupboard(); La classe Cupboard doit donc être chargée. On constate que cette classe contient des données statiques (y compris des membres statiques et des blocs de code statiques), et l'opération d'initialisation est effectuée selon l'ordre défini par les deux
【2】 static Bowl bowl4 = new Bowl(4); : Bowl(4)
【3】
 static{
 System.out.println("Exécution de bloc de code statique de classe Cupboard");
 }
 Sortie : Exécution de bloc de code statique de classe Cupboard
【4】 static Bowl bowl5 = new Bowl(5); Sortie : Bowl(5)
Une fois le membre statique initialisé, l'objet est généré via new. On constate que la classe contient une affectation de définition de membre et des blocs de code ordinaires, et l'opération d'initialisation est effectuée selon l'ordre dans lequel ils sont définis
【1】
 {
 System.out.println(" Exécution de bloc de code ordinaire de classe Armoire" );
 }
Sortie : Exécution de bloc de code ordinaire de classe Armoire
【2】 Bol bol3 = nouveau Bol(3); Sortie : Bol(3)
【3 】Constructor Cupboard(), Sortie : Cupboard() et f1(2)

3. Entrez la méthode principale
【1】 System.out.println("Création d'un nouveau Cupboard() dans main") ; Résultat : Création de new Cupboard( ) dans main
【2】 new Cupboard(); On constate que la classe Cupboard contient des affectations de définition de membres et des blocs de code ordinaires. L'opération d'initialisation est effectuée selon l'ordre dans lequel ils sont. défini. La sortie est : Exécution de bloc de code ordinaire de classe Cupboard et Bowl( 3)
【3】Constructor Cupboard(), sortie : Cupboard() et f1(2)
【4】 table.f2(1) ; Sortie : f2(1)
【5】 placard .f3(1); Sortie : f3(1)
Pour résumer, le résultat de sortie du programme est :
Bowl(1)
Bowl(2)
Table()
f1 (1)
Bowl(4)
Exécution de bloc de code statique de classe Cupboard
Bowl(5)
Exécution de bloc de code ordinaire de classe Cupboard
Bowl(3)
Cupboard()
f1(2)
Création d'un nouveau Cupboard() dans main
Exécution de bloc de code ordinaire de la classe Cupboard
Bowl(3)
Cupboard ()
f1(2)
f2(1 )
f3(1)

L'initialisation des données de la classe Java est résumée comme suit :

1. et les blocs de code statiques sont initialisés dans l'ordre défini

Ici Une chose à noter est que la condition préalable à l'exécution de code statique est que la machine virtuelle Java doit d'abord charger cette classe, et les données statiques ne seront initialisées qu'une seule fois. La classe est chargée lorsqu'un objet d'une classe est généré pour la première fois ou lorsque des données membres statiques appartenant à la classe sont accédées pour la première fois.

2. Les affectations aux définitions de membres ordinaires et aux blocs de code ordinaires sont initialisées dans l'ordre de définition

3 Enfin, la méthode du constructeurinitialisation

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn