关于static的初始化顺序

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

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

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

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

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

五、对有继承的class 当用new产生对象时,会按baseclass、derivedclass一、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();
///:~ 
输出结果为: 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)
相关文章
相关标签/搜索