如果类没有被加载进虚拟机,jvm首先将类加载进虚拟机内存
1、类加载,将累加载进jvm,并在准备阶段将类中的静态属性赋默认值,零值。
2、初始化类,执行静态代码块,为静态变量赋初值(一个类的静态代码块只执行一次,只能jvm调用)
类加载进内存之后
-
为实例对象分配内存空间,同时给非静态属性赋默认值(空闲列表,指针碰撞,展开说说)
-
调用父类构造器
-
父类构造器执行完之后后,如果自己声明属性的同时有显示的赋值,那么进行进行显示赋值把默认值覆盖。
-
执行匿名代码块
-
执行构造器
-
返回内存地址
测试代码:
public class test1 {
private static int k=1;
private static test1 t1=new test1("t1");
private static test1 t2=new test1("t2");
private static int i=print("i");
private static int n=99;
{
print("初始化块");
j=100;
}
public test1(String str){
System.out.println((k++)+":"+str+" i="+i+" n="+n);
++i;
++n;
}
static{
print("静态块");
n=100;
}
private int j=print("j");
public static int print(String str){
System.out.println((k++)+":"+str+" i="+i+" n="+n);
++n;
return ++i;
}
public static void main(String[] args) {
test1 test1=new test1("test");
}
}
结果:
1:初始化块 i=0 n=0
2:j i=1 n=1
3:t1 i=2 n=2
4:初始化块 i=3 n=3
5:j i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:初始化块 i=8 n=100
10:j i=9 n=101
11:test i=10 n=102