JVM启动一个主类的过程

JVM启动一个主类的过程,大致分为

  • 加载(loading):找到并创建类
  • 链接(linking):链接部分较为复杂,大致分为以下三个步骤

    1. 验证(verification):验证类二进制的良构性
    2. 准备(preparation):分配静态储存空间和jvm内部使用的数据结构例如方法表,创建类变量和常量以及为这些域设置默认值,这不会导致执行任何源代码,显式的初始化发生在初始化阶段
    3. 解析(resolution):非常灵活的一个过程
  • 初始化(initialization):类变量初始化和静态初始化,按照文本出现顺序,但在该类执行之前,它的父类必须先被(加载,链接)初始化,它父类的父类也必须先被(加载,链接)初始化...直至Object类完成初始化过程

    class Parent {   
        public static String staticVar = "Parent--staticVar";   
        public String var = "Parent--var";   

        static {    
            System.out.println("Parent--staticBlock");
            int a = 1;
        }   

        {   
            System.out.println(var);   
            System.out.println("Parent--block");   
        }   

        public Parent() {   
            System.out.println("Parent--constructor");    
        }   
    }   

    public class SubClass extends Parent {   
        public static String staticVarForSub = "Sub--staticVar";   
        public String varForSub = "Sub--var";   
        static {    
            System.out.println("Sub--staticBlock");   
        }   

        {   
            System.out.println(varForSub);   
            System.out.println("Sub--block");   
        }   

        public SubClass() {   
            System.out.println("Sub--constructor");   
        }   

        public static void main(String[] args) {   
            new SubClass();   
        }   
    }  

输出为

Parent--staticBlock
Sub--staticBlock
Parent--var
Parent--block
Parent--constructor
Sub--var
Sub--block
Sub--constructor

属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序:
1.父类静态成员和静态初始化快,按在代码中出现的顺序依次执行(后面定义的静态变量不能被前面的静态初始化块引用)。
2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
3.父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行(后面定义的变量不能被前面的初始化块引用)。
4.执行父类的构造方法。
5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。

references:

[1]The Java Virtual Machine Specification Java SE 8 Edition
[2]The Java Language Specification Java SE 8 Edition
[3]java类的成员初始化顺序和初始化块知识