静态代码块,非静态代码块,构造器的执行顺序和次数

时间:2020-12-15 19:31:40
静态代码块,非静态代码块,构造器的执行顺序和次数静态代码块,非静态代码块,构造器的执行顺序和次数View Code
 1 package com.Test;
 2 
 3 public class Test1 {
 4 
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         System.out.println("------------------第一次实例化对象--------------------");
11         Parent parent = new Child();
12         System.out.println("——————————————————第二次实例化对象————————————————————");
13         parent=new Child();
14     }
15 }
16 
17 class Parent {
18     public static StaticVarible staticVarible = new StaticVarible("父类-静态变量1");
19     public StaticVarible instVarible = new StaticVarible("父类-成员变量1");
20 
21     static {
22         System.out.println("父类-静态块");
23     }
24 
25     {
26         System.out.println("父类-初始化块");
27     }
28 
29     public Parent() {
30         System.out.println("父类-实例构造函数");
31     }
32 }
33 
34 class Child extends Parent {
35     public static StaticVarible staticVarible = new StaticVarible("子类-静态变量1");
36     public StaticVarible instVarible = new StaticVarible("子类-成员变量1");
37 
38     static {
39         System.out.println("子类-静态块");
40     }
41 
42     public Child() {
43         System.out.println("子类-实例构造函数");
44     }
45 
46     {
47         System.out.println("子类-初始化块");
48     }
49 
50 }
51 
52 class StaticVarible {
53     public StaticVarible(String info) {
54         System.out.println(info);
55     }
56 }

第一次实例化对象
父类-静态变量1
父类-静态块
子类-静态变量1
子类-静态块
父类-成员变量1
父类-初始化块
父类-实例构造函数
子类-成员变量1
子类-初始化块
子类-实例构造函数
——————————————————第二次实例化对象————————————————————
父类-成员变量1
父类-初始化块
父类-实例构造函数
子类-成员变量1
子类-初始化块
子类-实例构造函数

 

结论:

从上述结果可以看出,在实例化一个对象时,各部分的加载顺序如下:

  父类静态成员/父类静态初始化块 -> 子类静态成员/子类初始化块 -> 父类成员变量/父类初始化块 -> 父类构造函数 -> 子类成员变量/子类初始化块 -> 子类构造函数

静态代码块和静态成员只有类首次加载进内存时调用一次,只此一次。

非静态代码块和成员,每次创建对象时,会在构造函数之前被调用。

构造函数,每次创建对象时,最后调用。

创建子类对象时,先创建父类对象,再创建子类对象。