看本文之前:可以先去看看这篇文章 -> 类的加载顺序介绍
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()
输出步骤理解:
- new一个A2,此时类A2加载, 类A2静态成员变量的初始化和静态块的执行;—>(输出: a2 = a2的成员变量, A static )
- A2依赖与B2(A2中属性中有B2),这时就会加载类B2;—>(输出: B static )
- B2中有关联C2,类C2的静态块执行;—>(输出 C static) 然后执行C2构造方法,(输出: C2() )
- 同样的: B2中有关联D2,类D2的静态块执行;—>(输出 D static) 然后执行D2构造方法,(输出: D2() )
- 此时类B2的静态块和成员变量初始化完毕,执行B2的构造方法;—>(输出: B2() )
- 这个时候类A2中成员变量初始化完毕,会执行类A2的构造方法;—>(输出: A2() )
总结:
- 第一点,类的初始化顺序依次是:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器;
- 第二点,所有的类都会优先加载基类(父类)
- 第三点,静态成员的初始化优先(带static关键字)
- 第四点,在类的加载过程中,只有内部的变量创建完,才会去执行这个类的构造方法。
- 第五点,静态成员的初始化与静态块的执行,发生在类加载的时候。
- 第六点,类对象的创建以及静态块的访问,都会触发类的加载。