1、编译

       Java首先会通过编译器对.java文件进行编译,文件中每一个class对应生成一个单独的.class文件(匿名内部类会自动设置一个文件名)。

2、加载

       在创建对象时,加载器会找到对应的class文件,判断该类是否有继承关系,如果有继承关系,则找到基类的class文件,再次判断是否有继承关系,直到最终的基类的class文件被找到,然后初始化基类static相关的内容,如静态成员变量等,然后初始化下一级子类的static相关内容,直到最后一级子类的static相关内容被初始化完成。

3、初始化

       当加载阶段完成后,就会执行初始化,此初始化和加载时期的初始化不同,加载时期的初始化是针对于static相关的内容,而此时的初始化是针对于普通成员变量,顺序也是从基类开始,基类的普通成员变量按照定义的顺序进行初始化(如果只是定义,那么基本数据类型就会设为默认值,引用类型设为null),然后执行构造方法,执行完之后,按照先成员变量,后构造函数的顺序执行对子类进行初始化,层层递进,直至最后一级的子类被初始化。
       至此,对象完成创建和初始化。执行顺序一切以基类优先,毕竟没有基类,就不会有子类。类中初始化顺序:先静态资源,其次成员变量,最后构造函数。
       值得注意的是:如果基类的构造函数中调用了子类对其进行覆写的方法(也就是调用了多态方法),那么基类构造函数将调用子类覆写后的方法,而不是基类自己的方法;此时由于子类尚未进行初始化,调用该方法时涉及到的所有变量和引用都是默认值(0或者null)。