`
eriol
  • 浏览: 412231 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

类的初始化执行顺序

    博客分类:
  • Java
 
阅读更多

在笔试时做到一题关于类的变量和方法的初始化执行顺序的题,当时有点对于几个细节记得不是很清楚,这几天专门翻了下TIJ,总结了一下。

 

1.  类中的任何变量(不管是静态的还是非静态的)都在方法(包括构造函数)之前被初始化。

 

2.  静态变量先于非静态变量执行初始化。

 

3.  静态初始化只有在必要时刻才会进行,并且只在对象被第一次创建(或者第一次访问静态数据)时,它才会被初始化。此后,静态对象不会再次被初始化。

 

 

举个例子:

 

class Bowl {
	Bowl(int marker) {
		System.out.println("Bowl(" + marker + ")");
	}
	void f1(int marker) {
		System.out.println("f1(" + marker + ")");
	}
}

class Table {
	Bowl bowl3 = new Bowl(3);
	static Bowl bowl1 = new Bowl(1);
	Table() {
		System.out.println("Table()");
		bowl2.f1(1);
	}
	void f2(int marker) {
		System.out.println("f2(" + marker + ")");
	}
	static Bowl bowl2 = new Bowl(2);
}

public class InitializationTest {

	public static void main(String[] args) {
		System.out.println("Create new Cup in main");
		new Table();
		System.out.println("Create new Cup in main");
		new Table();
		table.f2(1);
	}
	static Table table = new Table();
}
 

其输出结果为:

 

 

// Output
Bowl(1)
Bowl(2)
Bowl(3)
Table()
f1(1)
Create new Cup in main
Bowl(3)
Table()
f1(1)
Create new Cup in main
Bowl(3)
Table()
f1(1)
f2(1)

 

因为要调用main函数,所以首先加载InitializationTest类,先初始化table变量,导致Table被加载。Table被加载后,先初始化静态变量bowl1和bowl2,再初始化非静态变量bowl3,最后调用Table构造函数。输出结果如Output中2至6行。

然后InitialziationTest类执行main函数,因为要测试静态变量是否只初始化一次,所以创建了两个新的Table对象。根据结果发现只有非静态变量bowl3被重复创建,而静态变量bowl1和bowl2只有在第一次时才被创建。

 

补充:静态方法体与其他静态初始化动作一样,仅执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即使从未生成过那个类的对象)。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics