一个实例理解Java类的加载顺序

看本文之前:可以先去看看这篇文章 -> 类的加载顺序介绍

package com.zking.test;

class A2{
    B2 b2 = new B2();
    private static String a2 = "a2的成员变量";
    static{
        System.out.println("a2 = " + a2);
        System.out.println("A static");
    }
    public A2() {
        System.out.println("A2()");
    }
}
class B2{
    C2 c2 = new C2();
    D2 d2 = new D2();
    static{
        System.out.println("B static");
    }
    public B2() {
        System.out.println("B2()");
    }
}
class C2{
    static{
        System.out.println("C static");
    }
    public C2() {
        System.out.println("C2()");
    }
}

class D2 {
    static {
        System.out.println("D static");
    }

    public D2() {
        System.out.println("D2()");
    }
}

public class VarTest {
    public static void main(String[] args) {
        A2 a2 = new A2();
    }
}

输出:

a2 = a2的成员变量
A static
B static
C static
C2()
D static
D2()
B2()
A2()

输出步骤理解:

  1. new一个A2,此时类A2加载, 类A2静态成员变量的初始化和静态块的执行;—>(输出: a2 = a2的成员变量, A static )
  2. A2依赖与B2(A2中属性中有B2),这时就会加载类B2;—>(输出: B static )
  3. B2中有关联C2,类C2的静态块执行;—>(输出 C static) 然后执行C2构造方法,(输出: C2() )
  4. 同样的: B2中有关联D2,类D2的静态块执行;—>(输出 D static) 然后执行D2构造方法,(输出: D2() )
  5. 此时类B2的静态块和成员变量初始化完毕,执行B2的构造方法;—>(输出: B2() )
  6. 这个时候类A2中成员变量初始化完毕,会执行类A2的构造方法;—>(输出: A2() )

总结:

  • 第一点,类的初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;
  • 第二点,所有的类都会优先加载基类(父类)
  • 第三点,静态成员的初始化优先(带static关键字)
  • 第四点,在类的加载过程中,只有内部的变量创建完,才会去执行这个类的构造方法。
  • 第五点,静态成员的初始化与静态块的执行,发生在类加载的时候。
  • 第六点,类对象的创建以及静态块的访问,都会触发类的加载。

猜你喜欢

转载自blog.csdn.net/X_0101/article/details/107568279