2 public function TestSandwich() {
3 new Sandwich();
4 }
5 }
6 class Water {
7 //static var w = trace("static water");
8 function Water() {
9 trace("Water");
10 }
11 }
12
13 class Meal {
14 //static var w = trace("static meal");
15 function Meal() {
16 trace("Meal");
17 }
18 }
19
20 class Bread {
21 function Bread() {
22 trace("Bread");
23 }
24 }
25
26 class Cheese {
27 function Cheese() {
28 trace("Cheese");
29 }
30 }
31
32 class Lettuce{
33 function Lettuce() {
34 trace("Lettuce");
35 }
36 }
37
38 class Lunch extends Meal {
39 function Lunch() {
40 trace("Lunch");
41 }
42 }
43
44 class PortableLunch extends Lunch {
45 //static var w = trace("static lunck");
46 function PortableLunch() {
47 trace("PortableLunch");
48 }
49 }
50
51 class Sandwich extends PortableLunch {
52 var bread:Bread = new Bread();
53 var cheese:Cheese = new Cheese();
54 var lettuce:Lettuce = new Lettuce();
55
56 //static var good = trace("static sandwich");
57
58 function Sandwich() {
59 trace("Sandwich");
60 }
61 }
62
测试类很简单只有一句:new Sandwich()。构造出 Sandwich 类一个实例。
Sandwich 类继承了 PortableLunch 这个类。现在有一个问题,是先有子类还是先有父类?是先有父亲后有儿子,还是先有儿子后有父亲?肯定是先有父亲。那么怎么有的父亲?需要先构造出来。怎么构造?调用构造函数!
因此,我们说在构造子类之前,要先将它的父类构造出来,如果父类还有父类,就要先把父类的父类构造出来。在这段程序中每个类在构造出来后都会打印出该类的类名。下面请看执行结果:
Bread
Cheese
Lettuce
Meal
Lunch
PortableLunch
Sandwich
我们看到,最先打印出来的是 Bread, Cheese, Lettuce。这是 Sandwich 类的三个成员变量,可见在调用构造函数之前,要新将该类的成员变量构造出来,然后再去构造这个类本身。
前面提到,要构造这个类就先要构造它的父类,Sandwich 的父类是 PortableLunch,而 PortableLunch 还有父类叫 Lunch,而 Lunch 还有父类叫 Meal,到了 Meal 就终止了。这时将执行 Meal 的构造函数,有了 Meal 之后就可以构造Lunch 了,有了 Lunch,PortableLunch 就可以构造,有了 PortableLunch 我们的 Sandwich 才被构造出来。
现在我们得到的结论就是:类的成员变量先被初始化,然后才是构造函数。
下面,请大家把代码中注释掉的部分全部打开。现在,又新加入了一些 static 的成员变量,我们来实验一下静态的成员变量是何时被调用的,执行结果如下:
static water
static meal
static lunck
static sandwich
Bread
Cheese
Lettuce
Meal
Lunch
PortableLunch
Sandwich
我们看到,所有静态的成员都先于非静态成员变量被构造出来!最上面有一个 Water 类,虽然没有地方会用到它,但是它也被打印出来了。结论是:当类被加载时静态的属性和方法就会被初始化。注意,什么叫类被加载时?这是指类被加载到内存里面。可见,我们整个这个 as 文件中的所有类都被加载到了内存中了,只要这个类被读入到内存中,那么它的所有静态成员就会被初始化。
最终的结论 —— 初始化顺序:
(1)当类被加载时该类的静态的属性和方法就会被初始化
(2)然后初始化成员变量
(3)最后构造出这个类本身