一,类初始化过程

  1. 一个类要创建实例需要先加载并初始化该类
  • main方法所在的类需要先加载和初始化
  1. 一个子类要初始化需要先初始化父类
  2. 一个类初始化就是执行<clinit>()方法
  • <clinit>()方法由静态类变量显示赋值代码和静态代码块组成
  • 类变量显示赋值代码和静态代码块代码从上到下一次执行
  • <clinit>()方法只执行一次 

二,实例初始化过程

  1. 实例初始化就是执行<init>()方法
  • <init>()方法可能重载有几个,有几个构造器就有几个<init>方法
  • <init>()方法由非静态实例变量显示赋值代码和非静态代码块组成, 对应构造器代码组成
  • 非静态实例变量显示赋值代码和非静态代码块从上到下顺序执行,而对应的构造器的代码最后执行
  • 每次创建实例对象,调用对应构造器,执行的就是对应的<init>方法
  • <init>方法的首行就是super()或super(实参列表),即对应父类<init>方法

三,实际例子

/**
 * 类初始化:
 * 先初始化父类(Object)
 * 再初始化子类(Father)   (5) (1)
 *
 * 子类实例初始化:
 *  *  1>super()方法
 *  *  2>i = test()     (9)
 *  *  3>子类非静态代码    (3)
 *  *  4>子类构造函数     (2)
 */
public class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("(1)");
    }

    public Father (){
        System.out.println("(2)");
    }

    {
        System.out.println("(3)");
    }

    //子类有重写这个方法,所以执行super时只会执行子类重写的方法
    public int test(){
        System.out.println("(4)");
        return 1;
    }

    public static int method(){
        System.out.println("(5)");
        return 1;
    }

}
/**
 * 类初始化:
 * 先初始化父类(Father)
 * 再初始化子类(Son)
 *
 * 子类初始化<clinit>():
 * 1>j = method()  (10)
 *  2>子类静态代码块  (6)
 *
 *  子类实例初始化:
 *  1>super()方法
 *  2>i = test()    (9)
 *  3>子类非静态代码   (8)
 *  4>子类构造函数    (7)
 */
public class Son extends Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.println("(6)");
    }

    public Son (){
        System.out.println("(7)");
    }

    {
        System.out.println("(8)");
    }

    public int test(){
        System.out.println("(9)");
        return 1;
    }

    public static int method(){
        System.out.println("(10)");
        return 1;
    }

    public static void main(String[] args) {
        Son son1 = new Son();
        System.out.println();
        Son son2 = new Son();
    }
}

运行结果为:

(5)
(1)
(10)
(6)
(9)
(3)
(2)
(9)
(8)
(7)

(9)
(3)
(2)
(9)
(8)
(7)

 四,小结

执行顺序为:

1,父类类初始化-->父类静态变量和静态代码块-->子类初始化-->子类静态变量和静态代码块-->父类实例化-->父类的非静态属性和非静态代码块-->父类构造函数-->子类实例化-->子类的非静态属性和非静态代码块-->子类构造函数

2,静态属性和静态代码块只执行一次