类的加载过程分为五个部分:(简写,后续补充)
加载、(验证、准备、解析)、初始化。
验证、准备、解析可以看作是链接过程。
加载
从文件加载到内存的过程。
验证
检查是否有不符合规范的代码,会不会出现安全问题
准备
为类变量分配内存(不是为实例,实例在初始化的时候才分配)。例如static变量(不会赋值,只给默认初始值)。
final static在该阶段就会赋代码值
解析
将符号引用直接转换为直接引用的过程。
初始化
实例化对象的过程,执行构造器。
静态数据加载过程
静态变量、代码块在类加载的时候就会调用,严格按照静态代码声明的顺序调用。
执行构造函数的时候,会先把其他属性初始化、初始化代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package javatest.pattern.staticload;
public class StaticTest {
public static void main(String[] args) { System.out.println("100"); } static StaticTest st = new StaticTest(); static { System.out.println("1"); } { System.out.println("2"); }
StaticTest() { System.out.println("3"); System.out.println("a=" + a + ",b=" + b); }
public static void staticFunction() { System.out.println("4"); }
int a = 110; static int b = 112; }
|
如果存在继承关系的时候,会先调用父类的静态代码块再执行子类的。