论坛中看到一道很有意思的代码,关于类的初始化顺序,这边尝试分析下。
Java类的初始化顺序
1 继承体系的所有静态成员初始化(先父类,后子类)
2 父类初始化完成(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)
这边需要理解的是,这些不是绝对的,如首先初始化的静态方法或者变量调用了类的构造函数,那么也会造成普通成员和构造函数先于其他静态变量的结果。
示例和分析
public class StringTest {
public static void main(String args[])
{
staticFunc();
}
static StringTest st = new StringTest();
static {
System.out.println("1");
}
{
System.out.println("2");
}
StringTest()
{
System.out.println("3");
System.out.println("a="+a + " b="+b);
}
public static void staticFunc()
{
System.out.println("4");
}
int a = 110;
static int b = 120;
}
2
3
a=110 b=0
1
4
先输出2,3是因为第一个静态变量调用了构造函数,所以类的普通变量和构造函数依次执行初始化。因为普通成员优先于构造函数初始化,所以a 可以拿到值为110,但是b并没有赋值,默认为0。
这些全部做完,也就是
这句话的了结,下面继续静态区初始化,故输出1.至此,类初始化完毕,
static StringTest st = new StringTest();
最后输出调用静态函数输出的结果。