今天我们先来一个小的Demo来了解类的加载顺序。
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println("*******************测试类的加载顺序开始*******************");
new SubClass();
System.out.println("*******************测试类的加载顺序结束*******************");
/**
* 测试结果:
* *******************测试类的加载顺序开始*******************
ParentClass 静态代码块....
SubClass 静态代码块....
ParentClass 匿名内部类....
ParentClass 构造函数....
SubClass 匿名内部类....
SubClass 构造函数....
*******************测试类的加载顺序结束*******************
*/
} } class ParentClass{
ParentClass(){
System.out.println("ParentClass 构造函数....");
} static{
System.out.println("ParentClass 静态代码块....");
} {
System.out.println("ParentClass 匿名内部类....");
} } class SubClass extends ParentClass{
SubClass(){
System.out.println("SubClass 构造函数....");
} static{
System.out.println("SubClass 静态代码块....");
} {
System.out.println("SubClass 匿名内部类....");
} }
由上测试结果可以得出结论:
9行10行对比说明:父类优先于子类加载,
11,12行对比说明:匿名内部类优先于构造函数
9,10 和11,12,13,14对比:说明静态代码块优先于类存在
总结以上:1.父类优先于子类加载,2.静态变量优先于类存在,3.匿名内部类优先于对象存在