•  类的初始化过程与类的实例化过程
  1. 类的初始化与类的实例化是两个完全不同的概念
  2. 类的初始化是指类加载过程中的初始化阶段对类变量按照程序猿的意图进行赋值的过程;
  3. 类的实例化是指在类完全加载到内存中后创建对象的过程。
  4. 要想创建一个类的实例,必须先将该类加载到内存并进行初始化,也就是说,类初始化操作是在类实例化操作之前进行的,但并不意味着:只有类初始化操作结束后才能进行类实例化操作
public class Father {
    private static String aa = aa();
    private String bb = bb();
    static {
        System.out.println("父类静态代码块");
    }
    {
        System.out.println("父类非静态代码块");
    }
    public Father() {
        System.out.println("父类构造器");
    }
    private static String cc = cc();
    private String dd = dd();
    private static String aa(){
        System.out.println("父类静态变量aa");
        return "";
    }
    private String bb(){
        System.out.println("父类成员变量bb");
        return "";
    }
    private static String cc(){
        System.out.println("父类静态变量cc");
        return "";
    }
    private String dd(){
        System.out.println("父类成员变量dd");
        return "";
    }
}

public class Main {
    public static void main(String[] args) {
        Father father = new Father();
    }
}
=====开始执行main方法=====
父类静态变量aa
父类静态代码块
父类静态变量cc
父类成员变量bb
父类非静态代码块
父类成员变量dd
父类构造器
=====结束执行main方法===== 

结论:(初始化顺序)
1、单类的初始化过程,先执行静态变量、静态代码块,再执行非静态变量、非静态代码块,最后执行构造器
2、静态变量和静态代码块的执行顺序取决于代码书写的顺序

public class Son extends Father{
    private static String aa = aa();
    private String bb = bb();
    static {
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类非静态代码块");
    }
    public Son() {
        System.out.println("子类构造器");
    }
    private static String cc = cc();
    private String dd = dd();
    private static String aa(){
        System.out.println("子类静态变量aa");
        return "";
    }
    private String bb(){
        System.out.println("子类成员变量bb");
        return "";
    }
    private static String cc(){
        System.out.println("子类静态变量cc");
        return "";
    }
    private String dd(){
        System.out.println("子类成员变量dd");
        return "";
    }
}

public class Main {
    public static void main(String[] args) {
//        Father father = new Father();
        Son son = new Son();
    }
}
=====开始执行main方法=====
父类静态变量aa
父类静态代码块
父类静态变量cc
子类静态变量aa
子类静态代码块
子类静态变量cc
父类成员变量bb
父类非静态代码块
父类成员变量dd
父类构造器
子类成员变量bb
子类非静态代码块
子类成员变量dd
子类构造器
=====结束执行main方法===== 

结论:(初始化顺序)
1、子类的初始化过程,先执行父类静态变量、静态代码块,再先执行子类静态变量、静态代码块,然后执行父类非静态变量、非静态代码块,父类的构造器,最后执行子类的。
2、静态变量和静态代码块的执行顺序取决于代码书写的顺序

 

  • 总的来说,类实例化的一般过程是:
  1. 父类的类构造器<clinit>() -> 子类的类构造器<clinit>() -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数。