Java中类的加载顺序

2018-08-23  本文已影响0人  BigDreamMaker

以前对类的加载顺序,静态变量的初始化,普通变量的初始化,构造函数的初始化,构造代码块,静态代码块的初始化顺序一直搞不清楚,于是乎今天特别的做了一下,记录。
为了完成今天的测试,先给出测试类。

1.测试类

public class Father {
    
    static String staticVar1 = LoaderUtils.getMemberValue("[父类]静态变量1");
    static String staticVar2 = LoaderUtils.getMemberValue("[父类]静态变量2");
    
    String normalVar1 = LoaderUtils.getMemberValue("[父类]普通变量1");
    String normalVar2 = LoaderUtils.getMemberValue("[父类]普通变量2");

    {
        System.out.println("[父类]匿名构造函数初始化");
    }
    
    static {
        System.out.println("[父类]静态匿名构造函数初始化");
    }

    Father() {
        System.out.println("[父类]无参构造函数初始化");
    }

}
public class Son extends Father {

    static String staticVar1 = LoaderUtils.getMemberValue("[子类]静态变量1");
    static String staticVar2 = LoaderUtils.getMemberValue("[子类]静态变量2");

    String normalVar1 = LoaderUtils.getMemberValue("[子类]普通变量1");
    String normalVar2 = LoaderUtils.getMemberValue("[子类]普通变量2");

    {
        System.out.println("[子类]匿名构造函数初始化");
    }

    static {
        System.out.println("[子类]静态匿名构造函数初始化");
    }

    public Son() {
        System.out.println("[子类]无参构造函数初始化");
    }
}
public class LoaderUtils {
    public static String getMemberValue(String input) {
        System.out.println(input);
        return input;
    }
}
public static void main(String[] args) {
        System.out.println("***************第[1]次调用构造函数**************");
        Son son1 = new Son();
        System.out.println("***************第[2]次调用构造函数**************");
        Son son2= new Son();
        System.out.println("***************第[3]次调用构造函数**************");
        Son son3 = new Son();
    }
***************第[1]次调用构造函数**************
[父类]静态变量1
[父类]静态变量2
[父类]静态匿名构造函数初始化
[子类]静态变量1
[子类]静态变量2
[子类]静态匿名构造函数初始化
[父类]普通变量1
[父类]普通变量2
[父类]匿名构造函数初始化
[父类]无参构造函数初始化
[子类]普通变量1
[子类]普通变量2
[子类]匿名构造函数初始化
[子类]无参构造函数初始化
***************第[2]次调用构造函数**************
[父类]普通变量1
[父类]普通变量2
[父类]匿名构造函数初始化
[父类]无参构造函数初始化
[子类]普通变量1
[子类]普通变量2
[子类]匿名构造函数初始化
[子类]无参构造函数初始化
***************第[3]次调用构造函数**************
[父类]普通变量1
[父类]普通变量2
[父类]匿名构造函数初始化
[父类]无参构造函数初始化
[子类]普通变量1
[子类]普通变量2
[子类]匿名构造函数初始化
[子类]无参构造函数初始化

2.结果分析

在本例中Son继承Father,并且在子,父类中分别定义了,静态变量,静态代码块,普通变量,构造代码块和构造函数。
由结果可以看出,在第一次调用构造函数的过程中,虽然子类Son没有显示的调用父类的无参构造,但是Java会帮我们完成调用父类无参构造的过程。

总结下来就是

上一篇下一篇

猜你喜欢

热点阅读