下面用几个例子来说明预先装载和按需装载的细节,具体理论请看java程序如何执行
1)预先装载
1.1)第一句输出,说明Bootstrap(类名无所谓,你改成Test一样行)这个类在程序启动时被加载了,(因为Java类被装载时,静态域代码会被执行)。为什么这个类一启动就会被加载呢?还不是main函数的第一句话,getClassLoader(),不然谁理你
1.2)第二句输出,说明是个叫AppClassLoader的类(它是Launcher的内部类),加载了Bootstrap这个类
1.3)第三句输出,说明AppClassLoader的父类是ExtClassLoader这个类
1.4)第四句输出,说明ExtClassLoader的父类是Bootstrap Loader
2)按需装载
2.1)装载条件
2.2)例子
解释:自己对照 2.1)装载条件看,自然能理解
3)加载器(各种Loader)的工作
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载
4)父类和子类的加载顺序
解释:
当一个类具有继承关系时,装载时从顶级类开始的,依次类推直至加载到这个类本身
5)未初始化的静态引用
解释:可以看到Course类的静态域并没用被执行,也就是说Course类并没有被装载,符合按需转载的条件
6)初始化的静态引用
把Teacher类中的
public static Course course;
改为
public static Course course = new Course(); //即使不加static,结果也一样
对course进行初始化,改后的运行结果:
解释:new了一下,说明调用了Course类的构造函数,理应加载嘛,符合按需装载的条件