JAVA中类的加载顺序

废话不说,直接上代码!

package Demo01.Day001;

/**
 * 类的加载及顺序测试
 * 测试结果:(输出顺序从上到下)
 * 父类静态变量
 * 父类静态代码块one
 * 父类静态代码块second
 * 父类非静态变量
 * 非静态语句one
 * 非静态语句second
 * 父类构造函数
 * 父类方法(静态 非静态不分先后,谁在前被调用则谁先被执行)
 *
 * 作者:张陈陈
 * 时间:2019/9/2/19:24
 */
public class Exam02Demo01 {
    //1.静态变量
     static String test01 = TestDemo01();

    //2.静态方法
     static String TestDemo01() {
        System.out.println("父类静态变量");
        return "静态变量";
    }

    //3.静态代码块
    static {
        System.out.println("父类静态代码块one");
    }

    static {
        System.out.println("父类静态代码块second");
    }

    //4.非静态变量
    String test02 = TestDemo02();

     //5.非静态变量测试方法
    public String TestDemo02() {
        System.out.println("父类非静态变量");
        return "父类非静态变量";
    }

    //6.非静态语句块
    {
        System.out.println("父类非静态语句one");
    }
    {
        System.out.println("父类非静态语句second");
    }

    //7.非静态方法
    public void methodTest(){
        System.out.println("父类非静态方法");
    }
    //7.1静态方法
    public static void staticMethodTest(){
        System.out.println("父类静态方法");
    }

    //8.构造函数


    public Exam02Demo01() {
        System.out.println("父类构造函数");
    }

    public static void main(String[] args) {
        Exam02Demo01 exam02Demo01 = new Exam02Demo01();
        exam02Demo01.staticMethodTest();
        exam02Demo01.methodTest();

    }
}

以上测试仅针对单独一个类中的元素加载顺序判断结果如下:

  • 测试结果:(输出顺序从上到下)
  • 父类静态变量
  • 父类静态代码块one
  • 父类静态代码块second
  • 父类非静态变量
  • 非静态语句one
  • 非静态语句second
  • 父类构造函数
  • 父类方法(静态 非静态不分先后,谁在前被调用则谁先被执行)

下面进行加子类的测试,测试代码如下:

package Demo01.Day001;

/**
 * 测试子类父类结合的时候类的加载顺序
 * 测试结果:(输出顺序从上到下)
 * 父类静态变量
 * 父类静态代码块one
 * 父类静态代码块second
 * 子类静态变量
 * 子类静态代码块one
 * 子类静态代码块second
 * 父类非静态变量
 * 父类非静态语句one
 * 父类非静态语句second
 * 父类构造函数
 * 子类非静态变量
 * 子类非静态代码块one
 * 子类非静态代码块second
 * 子类构造函数
 *
 * 从此两次测试结果得出关于类的加载顺序的以下结论
 * 1.加载父类静态变量
 * 2.加载父类中静态代码块的内容
 * 3.加载子类静态变量
 * 4.加载子类中静态代码块的内容
 * 5.加载父类非静态变量
 * 6.加载父类非静态代码块内容
 * 7.加载父类构造方法
 * 8.加载子类非静态变量
 * 9.加载子类非静态代码块内容
 * 10.加载子类构造方法
 *
 * 作者:张陈陈
 * 时间:2019/9/2/19:24
 */
public class Exam02Demo02 extends Exam02Demo01 {
    //1.静态变量
    static String test01 = SunTestDemo01();

    public static String SunTestDemo01() {
        System.out.println("子类静态变量");
        return "子类静态变量";
    }

    //2.静态代码块
    static {
        System.out.println("子类静态代码块one");
    }

    static {
        System.out.println("子类静态代码块second");
    }

    //3.非静态变量
    String test02 = SunTEstDemo02();

    public String SunTEstDemo02() {
        System.out.println("子类非静态变量");
        return "子类非静态变脸";
    }

    //4.非静态代码块
    {
        System.out.println("子类非静态代码块one");
    }

    {
        System.out.println("子类非静态代码块second");
    }

    //5.构造函数

    public Exam02Demo02() {
        System.out.println("子类构造函数");
    }

    //6.静态方法
    public static void StaticMethod() {
        System.out.println("子类静态方法");
    }

    //7.非静态方法
    public void Method() {
        System.out.println("子类非静态方法");
    }

    public static void main(String[] args) {
        Exam02Demo02 exam02Demo02 = new Exam02Demo02();
    }
}

子类继承父类后,测试代码的执行结果如下:

  • 测试结果:(输出顺序从上到下)
  • 父类静态变量
  • 父类静态代码块one
  • 父类静态代码块second
  • 子类静态变量
  • 子类静态代码块one
  • 子类静态代码块second
  • 父类非静态变量
  • 父类非静态语句one
  • 父类非静态语句second
  • 父类构造函数
  • 子类非静态变量
  • 子类非静态代码块one
  • 子类非静态代码块second
  • 子类构造函数
    从此两次测试结果得出关于JAVA中类的加载顺序的
    1.加载父类静态变量
    2.加载父类中静态代码块的内容
    3.加载子类静态变量
    4.加载子类中静态代码块的内容
    5.加载父类非静态变量
    6.加载父类非静态代码块内容
    7.加载父类构造方法
    8.加载子类非静态变量
    9.加载子类非静态代码块内容
    10.加载子类构造方法

小弟初来驾到,还请各路大神指点…