Java类初始化顺序

原创作品,转载请注明出自xelz's blog

博客地址:http://mingcn.cnblogs.com/

本文地址:http://mingcn.cnblogs.com/archive/2010/10/20/JavaClassInitOrder.html

 

Java技术笔试及面试中常出的问题,我们总结一下

直接看例子:

 

//test.java
public class test{
	public static void main(String[] args) throws Exception{
		new ExtendedClass();
	}
}

class BaseClass {
	BaseClass() {
		print("BaseClass:Constructor");
	}
	AnotherClass ac = new AnotherClass("BaseClass:Variable");
	{print("BaseClass:Initialization Block");}
	static{print("BaseClass:Static Initialization Block");}
	static AnotherClass sac = new AnotherClass("BaseClass:Static Variable");
	public static void print(Object o) {
		System.out.println(o);
	}
}

class ExtendedClass extends BaseClass {
	ExtendedClass() {
		print("ExtendedClass:Constructor");
	}
	{print("ExtendedClass:Initialization Block");}
	AnotherClass ac = new AnotherClass("ExtendedClass:Variable");
	static AnotherClass sac = new AnotherClass("ExtendedClass:Static Variable");
	static {print("ExtendedClass:Static Initialization Block");}
}

class AnotherClass {
	AnotherClass(Object o) {
		System.out.println(o);
	}
}

 

执行结果

BaseClass:Static Initialization Block

BaseClass:Static Variable

ExtendedClass:Static Variable

ExtendedClass:Static InitializationBlock

BaseClass:Variable

BaseClass:Initialization Block

BaseClass:Constructor

ExtendedClass:Initialization Block

ExtendedClass:Variable

ExtendedClass:Constructor

可以看出,在创建一个子类对象时,执行顺序是 

父类静态初始化块及静态成员变量

子类静态初始化块及静态成员变量

父类非静态初始化块及非静态成员变量

父类构造函数

子类非静态初始化块及非静态成员变量

子类构造函数

而关于同为静态(或非静态)的初始化块和成员变量执行的先后顺序是怎样呢,

仔细看例子就可以看出,例子中既有初始化块在成员变量之前,也有成员变量在初始化块之前的情况

运行结果是按源代码书写顺序执行

其实下面的两种书写方式是等价的

 

class test {
	static type t;
	static {
		someMethod();
	}
}

//二者等价
class test {
	static {
		type t;
		someMethod();
	}
}

 

posted @ 2010-10-20 18:12  xelz  阅读(638)  评论(0编辑  收藏  举报