Maison  >  Article  >  Java  >  Quel est l'ordre dans lequel les blocs de code et les constructeurs sont appelés lors de l'initialisation des objets Java ?

Quel est l'ordre dans lequel les blocs de code et les constructeurs sont appelés lors de l'initialisation des objets Java ?

王林
王林avant
2023-05-10 09:52:081082parcourir

    Ordre de priorité de chargement du code

    Bloc de code statique, variable membre statique -> bloc de code non statique, variable membre non statique -> nouveaux autres objets appellent la méthode de construction d'objet correspondante (en dehors de la méthode du local object Y compris le constructeur) -> le nouvel objet local appelle le constructeur.

    Remarque : S'il y a un nouvel objet, il y a des blocs de code statiques et des blocs de code non statiques dans l'objet. Chaque fois que l'objet est nouveau, le bloc de code non statique sera exécuté une fois, mais le bloc de code statique. Le bloc de code ne sera exécuté qu'une seule fois, puis le nouvel objet sera exécuté. Il ne sera pas exécuté à nouveau. 】

    Ordre d'exécution des méthodes de constructeur

    Bloc de code statique de classe parent (variable statique > bloc statique) > Bloc de code statique de sous-classe > Définition de différents blocs de code

    Bloc de code statique

    class Demo{ static { //静态代码块...... } }

    Caractéristiques : 1. Le code dans le bloc de code statique Java s'exécutera lorsque la classe chargera la JVM et ne sera exécuté qu'une seule fois 2. Les blocs statiques sont souvent utilisés pour l'exécution Initialisation des attributs de classe et certains travaux d'initialisation globale 3. Les blocs statiques ont priorité sur divers blocs de code et constructeurs. S'il y a plusieurs blocs de code statiques dans une classe, ils seront exécutés séquentiellement dans l'ordre d'écriture 4. Les blocs de code statiques peuvent. être défini n'importe où dans la classe, sauf dans le corps de la méthode [le corps de la méthode ici est n'importe quel corps de méthode] 5. Les blocs de code statiques ne peuvent pas accéder aux variables ordinaires

    Les blocs de code statiques seront présentés en détail

    Blocs de code statiques : utilisez du statique dans le bloc de code de déclaration de mot clé Java. Les blocs statiques sont utilisés pour initialiser les classes et initialiser les propriétés de la classe. Chaque bloc de code statique n'est exécuté qu'une seule fois.

    Étant donné que la JVM exécutera le bloc de code statique lors du chargement de la classe, le bloc de code statique est exécuté avant la méthode principale. Si la classe contient plusieurs blocs de code statiques, alors le code défini en premier sera exécuté en premier et le code défini ultérieurement sera exécuté. [Remarque : 1 Les blocs de code statiques ne peuvent exister dans aucun corps de méthode. 2 Les blocs de code statiques ne peuvent pas accéder directement aux variables d'instance statiques et aux méthodes d'instance. Ils doivent être accessibles via l'objet d'instance de la classe. 】 Bloc de code d'instance Le bloc de code d'instance est également appelé bloc d'initialisation de construction, bloc de code de construction et bloc d'initialisation.

    class Demo{ { //实例代码块...... } }

    Caractéristiques :

      1. Le bloc de code de construction est appelé lors de la création d'un objet, et il sera appelé une fois à chaque fois qu'un objet est créé
    • 2. l'exécution de la fonction constructeur, et en même temps le bloc de code de construction L'exécution dépend du constructeur
    • 3
    • Le bloc de code de construction est défini dans la classe

    • Le bloc de code partiel

    Le bloc de code partiel est également. appelé bloc de code ordinaire, bloc de code de méthode

    class Demo{ public void test(){ { //局部代码块...... } } }

    Caractéristiques : 1. Ordinaire Le bloc de code est défini dans le corps de la méthode 2. Le format du bloc de code ordinaire et du bloc de code d'instance sont les mêmes que {} 3. Le seul La différence directement visible entre le bloc de code ordinaire et le bloc de code construit est que le bloc de code construit est défini dans la classe. Les blocs de code ordinaires sont définis dans le corps de la méthode 4. Le cycle de vie des variables peut être limité, publié plus tôt et amélioré. Utilisation de la mémoire. Vérifiez l'ordre d'exécution de chaque bloc de code. L'exemple de code est le suivant :

    class Init {
        public Init() {
            System.out.println("无参构造器");
        }
        public Init(int a) {
            System.out.println("有参构造器");
        }
        {
            System.out.println("实例代码块1");
        }
        {
            System.out.println("实例代码块2");
        }
        {
            System.out.println("实例代码块3");
        }
        static {
            System.out.println("静态初始化块1");
        }
     
        static {
            System.out.println("静态初始化块2");
        }
    
        public void method(){
        	{
        		System.out.println("普通初始化块");
        	}
        }
    }

    Code de test Comme suit :

    class Demo {
        public static void main(String[] args) {
            Init init1 = new Init();
            init1.method();
            System.out.println("------------");
            Init init2 = new Init();
            init2.method();
            //多打印几个对象的目的是:方便看出Static静态代码块 是否只执行一次!!!
            System.out.println("------------");
            Init init3 = new Init();
            init3.method();
        }
    }

    Les résultats d'exécution sont les suivants :

    Conclusion :

    L'ordre d'exécution est : bloc de code statique> bloc de code d'instance> constructeur> bloc de code ordinaire, Quel est lordre dans lequel les blocs de code et les constructeurs sont appelés lors de linitialisation des objets Java ?

    Et le bloc de code statique sera appelé lorsque la classe est chargée, et appelé une seule fois (exécuté en tant que classe est chargé).

    Alors quand le cours sera-t-il chargé ?

    - Lors de la création d'une instance d'objet (nouveau)

    - Lors de la création d'une instance d'objet de sous-classe, la classe parent sera également chargée - Lors de l'utilisation de membres statiques de la classe (propriétés statiques, méthodes statiques)

    Vérifier l'existence de chaque bloc de code dans la relation d'héritage La séquence d'exécution

    par exemple, la relation d'héritage est

    Trois——> Deux——>

    D'après les résultats de l'exécution, on peut voir que l'héritage de plusieurs classes Il existe des blocs d'initialisation, des blocs d'initialisation statiques et des constructeurs. L'ordre d'exécution réel est le suivant : exécuter les blocs statiques de la classe parent A, les blocs statiques de. classe parent B, et enfin les blocs statiques de la sous-classe, puis exécutez les blocs de code d'instance de la classe parent A. et le constructeur, puis le bloc de code d'instance et le constructeur de la classe B, et enfin exécutez le bloc de code d'instance et le constructeur de la sous-classe C [Remarque : ABC correspond ici à Un, Deux, Trois]

    Conclusion :

    L'ordre d'exécution des blocs d'initialisation, des blocs d'initialisation statiques et des constructeurs dans l'héritage de plusieurs classes est :

    父类静态块——>子类静态块——>父类实例代码块——>父类构造器——>子类实例代码块——>子类构造器 ——>(如果有局部代码块, 再正常执行即可, 这里就没必要进行测试了)

    通过字节码深究实例代码块优先于构造器原因

    我们那一段代码作为例子说明下,代码如下:

    class Init {
        public Init() {
            System.out.println("无参构造器");
        }
        public Init(int a) {
            System.out.println("有参构造器");
     
        }
     
        {
            System.out.println("实例代码块1");
        }
     
        {
            System.out.println("实例代码块2");
        }
     
        {
            System.out.println("实例代码块3");
        }
     
        static {
            System.out.println("静态初始化块1");
        }
     
        static {
            System.out.println("静态初始化块2");
        }
     
        public void method(){
            {
                System.out.println("普通初始化块");
            }
        }
    }

    接下来让我们看看 , Init.java编译完的的字节码文件(Init.class)

    Quel est lordre dans lequel les blocs de code et les constructeurs sont appelés lors de linitialisation des objets Java ?

    从这个字节码文件就可以很清晰的看出, 实例代码块实际上是被依次放到了构造方法的第一句, 所以可以的出此结论: 实例代码块的执行顺序是优先于构造器的。

    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:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer