详解Java 类的初始化


论坛中看到一道很有意思的代码,关于类的初始化顺序,这边尝试分析下。

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。
这些全部做完,也就是
static StringTest st = new StringTest();

这句话的了结,下面继续静态区初始化,故输出1.至此,类初始化完毕,
最后输出调用静态函数输出的结果。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值