<p>class loader加载并非是在程序开始时将所有的类文件加载进去,而是根据需要进行动态加载,</p>
<p>具体加载顺序如上图,最上层的bootstrap classloader是用c/c++写的,并非java。
最下层的custom classloader是用户自定义的class loader</p>
<p>类加载共分三步:加载,链接,初始化。共有以下几种情况类会被加载:1):初学者最为常用的new一个类的实例对象
2):对类的静态变量进行读取、赋值操作的。(静态,final且值确定是常量,是编译时确定的,调用的时候直接用,不会加载对应的类)
3):直接调用类的静态方法。
4):反射调用一个类的方法。
5):初始化一个类的子类的时候,父类也相当于被程序主动调用了(如果调用子类的静态变量是从父类继承过来并没有复写的,那么也就相当于只用到了父类的东东,和子类无关,所以这个时候子类不需要进行类初始化)。
6):直接运行一个main函数入口的类。
所有的JVM实现(不同的厂商有不同的实现,有人就说IBM的实现比Sun的要好……)在首次主动调用类和接口的时候才会初始化他们。</p>