最近一直在看《thinking in java》一书,感觉里面东西讲的很细,很多东西都没有接触过,是值得各位java程序员仔细品味的一本好书。
今天看了关于类成员初始化那节,以前对于成员初始化顺序没有考虑那么多,没有在意初始化的顺序。今天特意仔细研究了一番。
一个类中,最首先被初始化的是静态成员,也就是有关键字static修饰的成员。只要一个类被使用也就是创建对象或者调用了该类的某个静态方法时静态成员就都会被初始化,并且静态数据在内存中只占用一份存储区域,无论创建多少个对象,静态数据被所有对象共享。
初始化静态成员后再初始化非静态成员。对于非静态成员之间,也是有初始化顺序的,变量定义的顺序决定了初始化的顺序(无论成员变量在哪里定义,都会在函数调用之前得到初始化)
直接定义成员初始化完成后才会执行构造函数初始化。
具体看例子:
1 public class House {
2 //对于非静态成员变量,谁先定义谁就先被初始化。顺序为w1、w2、w3
3 Window w1 = new Window(1);
4 public House() {
5 System.out.println(“House()”);
6 w3 = new Window(33);
7 }
8 Window w2 = new Window(2);
9 void f(){
10 System.out.println(“f()”);
11 }
12 static void f1(){
13 System.out.println(“static f1()”);
14 }
15 Window w3 = new Window(3); //在函数f后面,但是在f调用之前得到了初始化
16 static Window w4 = new Window(4); //静态成员变量最先被初始化
17 /*
18 @param args
19 */
20 public static void main(String[] args) {
21 House h = new House();
22 h.f();
23 House.f1();
24 }
25
26 }
27 class Window{
28 public Window(int maker) {
29 System.out.println(“Window(“+maker+”)”);
30 }
31 }
执行结果如下:
1 Window(4)
2 Window(1)
3 Window(2)
4 Window(3)
5 House()
6 Window(33)
7 f()
8 static f1()
这样很明显就能看出成员的初始化顺序了。