LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2029|回复: 0

关于static的初始化顺序[zt]

[复制链接]
发表于 2004-6-1 08:18:22 | 显示全部楼层 |阅读模式
zt from http://www.chinajavaworld.com


于初始化主要包含这几方面:static 变量 、non-static变量、构造函数、new对象建立。

1、static 变量的初始化:当pulic class 被loadin(栽入)的时候,就开始对static变量初始化了,因为static 变量的refrence是存储在static storage(静态存储空间)中。此时不对non-static变量和构造函数初始化,因为还没有对象的产生,只是把某个型别loadin。注意对于static变量只初始化1次,当有新的对象产生时,他并不会重新被初始化了,也就是他的refrence已经固定,但他的值是可以改变的。

2、当有对象产生时,开始对此class(型别)内的non-static变量进行初始化,然后再初始化构造函数。产生已初始化的object对象。

3、按要求顺序执行其它函数。

4、对有继承的class(型别)来说:derivedclass2、derivedclass1、baseclass;因为他们之间的继承关系,所以要想laodin derivedclass2,必须先loadin derivedclass1,如果想laodin derivedclass1,则先loadin baseclass。也就是说,laodin 顺序为:baseclass、derivedclass1、deriveclass2……,每当loadin 一个class时,则按“第一条”进行初始化(初始化该class内的static变量)。

5、对有继承的class 当用new产生对象时,会按baseclass、derivedclass1、deriveclass2……的顺序,每个class内再按“第二条”进行初始化。注意derived class 的构造函数,一定要满足baseclss可初始化。

总体思想:static变量……non-static变量……构造函数。



thinking in java中的一段程序:
[PHP]

class Bowl {
Bowl(int marker) {
   System.out.println("Bowl(" + marker + ")");
}
void f(int marker) {
   System.out.println("f(" + marker + ")");
}
}
class Table {
static Bowl b1 = new Bowl(1);
Table() {
   System.out.println("Table()");
   b2.f(1);
}
void f2(int marker) {
   System.out.println("f2(" + marker + ")");
}
static Bowl b2 = new Bowl(2);
}

class Cupboard {
Bowl b3 = new Bowl(3);
static Bowl b4 = new Bowl(4);
Cupboard() {
   System.out.println("Cupboard()");
   b4.f(2);
}
void f3(int marker) {
   System.out.println("f3(" + marker + ")");
}
static Bowl b5 = new Bowl(5);
}

public class StaticInitialization {
public static void main(String[] args) {
   System.out.println(
     "Creating new Cupboard() in main");
   new Cupboard();
   System.out.println(
     "Creating new Cupboard() in main");
   new Cupboard();
   t2.f2(1);
   t3.f3(1);
}
static Table t2 = new Table();
static Cupboard t3 = new Cupboard();
} ///:~




[/PHP]
输出结果为:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表