分享一个类的加载初始化代码demo,这段代码考察类中内容的加载顺序,很有意思
一起钻研走一下
public class InitializeDemo {
private static int k = 1;
private static InitializeDemo t1 = new InitializeDemo("t1");
private static InitializeDemo t2 = new InitializeDemo("t2");
private static int i = print("i");
private static int n = 99;
{
print("初始化块");
j = 100;
}
public InitializeDemo(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) {
InitializeDemo test = new InitializeDemo("test");
}
}
任何java程序的入口都是main方法,且main方法是唯一入口,我们先从main方法入手
思路如下:
1.main方法new了一个对象InitializeDemo,这是第一次加载这个对象类
2.首先从上至下一次执行静态代码或参数
2.1> k=1
2.2> new InitializeDemo("t1");
2.2.1>再次newInitializeDemo,从上到下依次执行非静态代码或参数
2.2.2>执行初始化块,j=100
2.2.3>执行 private int j = print("j");
2.3> new InitializeDemo("t2");
2.3.1>再次newInitializeDemo,从上到下依次执行非静态代码或参数
2.3.2>执行初始化块,j=100
2.3.3>执行 private int j = print("j");
2.4>执行private static int i = print("i");
2.5>执行private static int n = 99;2.6>执行静态代码块
3.到此为止类初始化完毕,开始执行入口函数new InitializeDemo("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
来运行看一下运行结果:
没问题。面试的时候可能会考察一下这个,大家可以用这道题目练习一下