1.不涉及类的继承体系的初始化顺序
public class InitialOrderTest {
//静态初始化块1
static {
// System.out.println(staticField); //error! 说明静态初始化块和静态变量等级一样,按照先后出现顺序进行初始化。
int i = 2;
System.out.println(i);
System.out.println("静态初始化块1");
}
//静态变量
public static String staticField = "静态变量";
//变量
public String field = "变量";
//静态初始化块2
static {
System.out.println(staticField);
System.out.println("静态初始化块2");
}
//初始化块
{
System.out.println(field);
System.out.println("初始化块");
}
//构造器
public InitialOrderTest() {
System.out.println("构造器");
}
public static void main(String[] args) {
new InitialOrderTest();
}
}
/*
http://hi.baidu.com/kresnik%5F9108/blog/item/9f204b86c8916baf0cf4d228.html
该文中有错误,静态初始化块和静态变量等级一样,按照先后出现顺序进行初始化。
*/
2.涉及类的继承体系的初始化
参见以上的网文。
在任何其他事物发生之前,将分配给对象的存储空间初始化为二进制的0。(thinking in java4中文版-第8章-P163)
C++中的初始化顺序是:
1. 初始化基类中成员变量;
2. 调用基类构造函数
3. 初始化子类成员变量(不包括成员初始化列表中的)
4. 调用子类构造函数(按成员变量声明顺序)
#include <stdio.h>
class b{
public:
int i;
b(){printf("b/n");};
b(int a){i=a;printf("b,i=%d/n",i);};
};
class base{
public:
base(){printf("base/n");};
b b0;
};
class a{
public:
a(){printf("a/n");};
};
class derived : public base{
private:
a a1;
b b1;
public:
derived(int i):b1(i){printf("derived/n");};
};
int main(){
derived d(3);
}