- public class StaticTest {
- public static int k = 0;
- public static StaticTest t1 = new StaticTest("t1");
- public static StaticTest t2 = new StaticTest("t2");
- public static int i = print("i");
- public static int n = 99;
- public int j = print("j");
- {
- print("构造块");
- }
- static{
- print("静态块");
- }
- public StaticTest(String str) {
- System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
- ++n;
- ++i;
- }
- public static int print(String str) {
- System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
- ++i;
- return ++n;
- }
- public static void main(String[] args) {
- StaticTest t = new StaticTest("init");
- }
分析:
类的生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。
该类首先被加载,然后经过验证,进入准备阶段,
在准备阶段时:
在方法区为静态成员分配内存空间,并设置初始值:k=0,t1=null,t2=null,i=0,n=0,j=0。
在初始化阶段时:
会按照类文件中的代码顺序初始化静态成员,从上至下
初始化k=0,
初始化t1=new StaticTest("t1"),此时会导致类的实例化。
类的实例化会在堆上分配空间,设置实例成员的值、执行构造代码块。所以先print("j");再print("构造块"); 然后执行new StaticTest("t1");
- 1:j i=0 n=0
- 2:构造块 i=1 n=1
- 3:t1 i=2 n=2
初始化t2=new StaticTest("t2"),此时会导致类的实例化。
类的实例化会在堆上分配空间,设置实例成员的值、执行构造代码块。所以先print("j");再print("构造块"); 然后执行new StaticTest("t2");
- 4:j i=3 n=3
- 5:构造块 i=4 n=4
- 6:t2 i=5 n=5
初始化i = print("i");
- 7:i i=6 n=6
初始化n=99;
执行静态块print("静态块");
8:静态块 i=7 n=99
此时,初始化完毕,再执行new StaticTest("init");
- 9:j i=8 n=100
- 10:构造块 i=9 n=101
- 11:init i=10 n=102
------------------
输出为:
- 1:j i=0 n=0
- 2:构造块 i=1 n=1
- 3:t1 i=2 n=2
- 4:j i=3 n=3
- 5:构造块 i=4 n=4
- 6:t2 i=5 n=5
- 7:i i=6 n=6
- 8:静态块 i=7 n=99
- 9:j i=8 n=100
- 10:构造块 i=9 n=101
- 11:init i=10 n=102