Java初始化顺序

java文件的初始化顺序:

(静态变量,静态块(两者根据代码顺序先后执行))>(普通变量,构造块(两者根据代码顺序先后执行))>(构造方法)

如果有继承关系的话,会先执行父类的静态变量和静态块,然后再执行子类的静态变量和静态块;之后再执行父类的普通变量,初始化块,构造方法,最后才执行子类的普通变量,初始化块,构造方法。

注意,是初始化,并不是生成父类对象。并且静态变量和静态块只初始化一次,而普通变量和构造块依托构造方法,在每次调用构造方法之前都会先执行普通变量和构造块。

package com.wangbiao.second;


/**
 * 
 * java 初始化顺序
 * @author WangBiao
 *2013-5-9下午03:43:30
 */
public class TestSequence {

//	总结:(静态变量,静态块(两者根据代码顺序先后执行))>(普通变量,构造块(两者根据代码顺序先后执行))>(构造方法)
	public static void main(String[] args) {
		//单个A进行实例化的结果
//		A静态变量初始化
//		A静态块初始化
//		A初始化块
//		A普通变量初始化
//		A的构造方法
		//A a=new A();
		
		
		//有继承关系的进行实例化的结果
//		A静态变量初始化
//		A静态块初始化
//		B静态变量初始化
//		B静态块初始化
//		A初始化块
//		A普通变量初始化
//		A的构造方法
//		B初始化块
//		B普通变量初始化
//		B的构造方法
		
		B b=new B();
	}
}

class A {

	private static C c1 = new C("A静态变量初始化");

	public A() {
		System.out.println("A的构造方法");
	}
	static {
		System.out.println("A静态块初始化");
	}

	{
		System.out.println("A初始化块");
	}

	private C c2 = new C("A普通变量初始化");

}

class B extends A {

	private static C c1 = new C("B静态变量初始化");

	static {
		System.out.println("B静态块初始化");
	}

	{
		System.out.println("B初始化块");
	}

	private C c2 = new C("B普通变量初始化");

	public B() {
		System.out.println("B的构造方法");
	}
}

class C {
	public C(String str) {
		System.out.println(str);
	}
}

你可能感兴趣的:(java,顺序,初始化)