在类的内部,成员变量定义的先后顺序决定了初始化的顺序,其中,先初始化静态变量(或者对象),再初始化非静态变量(或者对象)。
在new 出一个对象时,必定是先初始化成员变量,成员变量包括基本数据类型和引用对象,然后再执行构造器。
静态初始化只在Class对象首次加载的时候进行一次。
下面的程序说明了这一点(故意打乱了编码的顺序,实际开发中,还得要按正常的编码顺序来写)
package com.thinkingInJava;
public class StaticInitialzation {
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Creating new Cupboard in main");
new Cupboard();
System.out.println("Creating new Cupboard in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
}
class Bowl{
Bowl(int marker){
System.out.println("Bowl" + marker);
}
void f1(int marker){
System.out.println("f1(" + marker + ")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1);
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard(){
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
输出:
Bowl1
Bowl2
Table()
f1(1)
Bowl4
Bowl5
Bowl3
Cupboard()
f1(2)
Creating new Cupboard in main
Bowl3
Cupboard()
f1(2)
Creating new Cupboard in main
Bowl3
Cupboard()
f1(2)
f2(1)
f3(1)