我个人理解 初始化分为五个主要部分(不考虑 编译期常量什么) :
静态代码块 非静态代码块 静态变量初始值 非静态变量初始化值 系统默认初始化变量值
这里说的 变量初始值 是指: int a=3; 这种人为的 不是jvm自动给变量赋初值那种
静态部分:
顺序:静态代码块 >静态变量初始化值
非静态部分:
顺序: 非静态代码块> 非静态变量初始化值
系统默认初始化变量值 是看是否 已经对变量进行过初始化 如果没有才会执行系统默认初始化变量值
example(需要注意下面变量 c 的值的变化):
public class Ming extends User {
static {
System.out.println("我是静态初始化块(只执行一次 就是类加载时)");
a=2;
}
{
System.out.println("我是非静态初始化块(创建对象就会执行)");
b=4;
c=4;
}
public static int a=1;
public int b=3;
public int c;
}
public class Persistence {
public static void main(String[] args) {
Ming ming = new Ming();
System.out.println(ming.a);
System.out.println(ming.b);
System.out.println(ming.c);
}
}
结果为:
我是静态初始化块(只执行一次 就是类加载时)
我是非静态初始化块(创建类就会执行)
1
3
4