当类加载操作完成,开始进行实例化。

  1. 在实例化子类B时,先要实例化父类A
  2. 实例化父类A时,先成员实例化(非静态代码)
  3. 父类A的构造方法
  4. 子类B的成员实例化(非静态代码)
  5. 子类B的构造方法
初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数

注意:静态代码块先于静态成员属性初始化,普通代码块先于构造函数初始化。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class SingleTon {
  private static SingleTon singleTon = new SingleTon();
  // count1=1,count2=1
  public static int count1;
  // count1=1,count2=1(没进行初始化)
  public static int count2 = 0;
  // count1=1,count2=0

  private SingleTon() {
    count1++;
    count2++;
  }

  public static SingleTon getInstance() {
    return singleTon;
  }
}

public class Test {
  public static void main(String[] args) {
    SingleTon singleTon = SingleTon.getInstance();
    System.out.println("count1=" + singleTon.count1);
    System.out.println("count2=" + singleTon.count2);
  }
} 

SingleTon singleTon = SingleTon.getInstance();调用了类的SingleTon调用了类的静态方法,触发类的初始化 类加载的时候在准备过程中为类的静态变量分配内存并初始化默认值

singleton=null count1=0,count2=0

类初始化化,为类的静态变量赋值和执行静态代码快。singleton 赋值为 new SingleTon()调用类的构造方法 调用类的构造方法后

count=1;count2=1