java 代码初始化顺序

package org.sunsf;

public class InitSeq {
	public static void main(String[] args) {
		/**
		 * 规则1(无继承情况下):<BR>
		 * 对于静态变量、静态初始化块、变量、初始化块、构造器,<BR>
		 * 它们的初始化顺序依次是<BR>
		 * (静态变量、静态初始化块)>(变量、初始化块)>构造器<BR>
		 */
		new InitSeqTest();
		/**
		 * 执行结果<BR>
		 * 静态变量<BR>
		 * 静态初始化块<BR>
		 * 变量 <BR>
		 * 初始化块 <BR>
		 * 构造器<BR>
		 */
		System.out.println("========================");
		/**
		 * 规则2(有继承情况下):<BR>
		 * 子类的静态变量和静态初始化块的初始化 是在父类的变量、初始化块和构造器初始化之前就完成
		 */
		new SubClass();
		/**
		 * 父类--静态变量<BR>
		 * 父类--静态初始化块<BR>
		 * 子类--静态变量<BR>
		 * 子类--静态初始化块<BR>
		 * 父类--变量<BR>
		 * 父类--初始化块<BR>
		 * 父类--构造器<BR>
		 * 子类--变量<BR>
		 * 子类--初始化块
		 */
		System.out.println("========================");
		/**
		 * 规则3(静态变量和静态初始化块):<BR>
		 * 静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。<BR>
		 * 同样,变量和初 始化块也遵循这个规律。
		 */
		/**
		 * Test-static-A<BR>
		 * Test-static-B<BR>
		 * 静态初始化块<BR>
		 * Test--C <BR>
		 * 构造器
		 */
		new Test1();
	}
}

class InitSeqTest {
	// 静态变量
	public static String staticField = "静态变量";
	// 变量
	public String field = "变量";
	// 静态初始化块
	static {
		System.out.println(staticField);
		System.out.println("静态初始化块");
	}
	// 初始化块
	{
		System.out.println(field);
		System.out.println("初始化块");
	}

	// 构造器
	public InitSeqTest() {
		System.out.println("构造器");
	}
}

class Parent {
	public static String p_StaticField = "父类--静态变量";
	public String p_Field = "父类--变量";
	static {
		System.out.println("父类--静态初始化块" + " ~ " + p_StaticField);
	}
	{
		System.out.println("父类--初始化块" + " ~ " + p_Field);
	}

	public Parent() {
		System.out.println("父类--构造器");
	}
}

class SubClass extends Parent {
	public static String s_StaticField = "子类--静态变量";
	public String s_Field = "子类--变量";
	static {
		System.out.println("子类--静态初始化块" + " ~ " + s_StaticField);
	}
	{
		System.out.println("子类--初始化块" + " ~ " + s_Field);
	}

	public SubClass() {
		System.out.println("子类--构造器");
	}
}

// /////////////////////////////////////////////
class Test1 {
	// 可以调换a b c 的位置进行测试
	public static TestA a = new TestA();
	public static TestB b = new TestB();
	public TestC c = new TestC();

	public Test1() {
		System.out.println("构造器");
	}

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

class TestA {
	public TestA() {
		System.out.println("Test-static-A");
	}
}

class TestB {
	public TestB() {
		System.out.println("Test-static-B");
	}
}

class TestC {
	public TestC() {
		System.out.println("Test--C");
	}
}

猜你喜欢

转载自babablog.iteye.com/blog/1870548