静态数据成员的初始化是在类的构造函数之前就完成的,如果静态数据成员是基本类型,没有将其进行初始化,那么它得到的就是基本类型的标准初值。如果是一个对象引用,那么除非新创建一个对象,并指派给该引用,否则它就是空值(null)。看下面一个例子:
StaticInitialization.java
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("Creatin new Cupboard() in main");
  new Cupboard();
  System.out.println("Creatin new Cupboard() in main");
  new Cupboard();
  t1.f2(1);
  c1.f3(1);

 }
 static Table t1=new Table();
 static Cupboard c1=new Cupboard();
 
}

那么输出的结果如下:
Bowl(1)
Bowl(2)
Table()
f(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f(2)
Creatin new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
Creatin new Cupboard() in main
Bowl(3)
Cupboard()
f(2)
f2(1)
f3(1)

得出如下结论:
静态成员在初始化以后,就不再进行初始化,不管创建多少个对象,静态数据成员只占有一份内存空间;
静态成员根据在类中的顺序进行初始化;
静态成员数据之后就是非静态成员数据,然后再构造函数,因为构造函数可能使用成员数据,所以成员数据会在构造函数之前就初始化;

通过改变main函数所在类最后两个初始化语句的位置得到:
如果将其移到main函数里面,结果就报错:非法的表示式开始,说明在函数中不能定义static的变量,static变量只能是class的,而且local变量除了可以用final以外,不能使用其它modifier;
如果将静态的改成非静态也报错,无论放在main函数之前还是之后都报错,因为在static函数中不能
引用非static变量;