类加载及对象 成员变量初始化顺序


package demo;
/**
 * 
 * @author Administrator
 *	<p>
 *	1. 首先加载LoadClassExample这个类的字节码时试图访问静态的main方法发现继承了父类,仍然继续加载当前类
 *	</p>
 *	<p>
 *	2. 当前类加载的字节码加载完成之后由于其继承了父类就会加载父类的字节码,如果父类还有父类,
 *	          则继续加载当前父类,当前父类加载完成之后再来加载父类的父类,以此类推
 *	</p>
 *	<p>
 *	3. 所有字节吗加载完成之后,开始从最顶端的根基类进行静态初始化
 *	       (static属性与static静态代码块均按照代码出现顺序进行静态初始化,如果static属性先出现则先加载属性,
 *		如果静态代码块先出现则先加载静态代码块,并非静态代码块就一定在static属性之前被加载,而是按各自出现的顺序被加载)
 *	      基类的静态属性被加载完成之后,依次向后初始化其父类的static属性,保证父类的static属性依赖基类成员能够正确被初始化
 *	</p>
 *<p>
 * 4. 所有的类及静态属性加载完成之后开始进行创建对象操作,首先从main方法开始执行,
 * 	    创建对象时首先将基本类型设为默认值,而引用类型设为null ,
 *    然后当调用父类的构造方法(注意:此时当前类的成员变量还未被初始化,仅仅是将对象的内存设为二进制0而产生基本类型为默认值,引用类型为null),
 *	 调用父类的构造方法时同样会首先将成员变量进行清零处理,依次类推,到达根基类后同样清零之后然后开始执行成员变量初始化操作(成员变量的初始化与{}代码块一样按照出现顺序执行,先出现先执行),
 *	根基类成员变量初始化完成之后调用其构造方法主体开始执行构造方法的内容,对象被创建,然后进行父类的成员变量赋值初始化及对象的创建工作
 *</p>
 */
public class LoadClassExample extends BaseClass
{

	private int k=printInit("LoadClassExample.k initalized");//16
	
	public LoadClassExample()
	{
		//super();  9
		System.out.println("k="+k);//18
		System.out.println("j="+j);//19
	}
	
	static int y=printInit("LoadClassExample.y initalied"+a);//5
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		System.out.println("LoadClassExample constructor ");//7
		LoadClassExample l=new LoadClassExample();//8
		//20
	}
	static
	{
		System.out.println("LoadClassExample static block initalized");//6
	}
	{
		System.out.println("LoadClassExample instance initalized");//17
	}

}

class BaseClass
{
	private int i=9;//10
	protected int j;//11
	
	public BaseClass()
	{
		System.out.println("i="+i+", j="+j);//14
		j=39;//15
	}
	int q=printInit("BaseClass.q initalized");//12
	static int a=3; //1
	private static int x=printInit("static BaseClass.x initalized"+a);//3
	static int printInit(String s)//2
	{
		System.out.println(s);
		return 46;
	}
	{
		System.out.println("BaseClass instance initalized");//13
	}
	static
	{
		System.out.println("BaseClass static block initalized");//4
	}
}

输出结果:

static BaseClass.x initalized3
BaseClass static block initalized
LoadClassExample.y initalied3
LoadClassExample static block initalized
LoadClassExample constructor
BaseClass.q initalized
BaseClass instance initalized
i=9, j=0
LoadClassExample.k initalized
LoadClassExample instance initalized
k=46
j=39

以上为个人理解,肯定有错误之处,转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值