静态数据成员的初始化是在类的构造函数之前就完成的,如果静态数据成员是基本类型,没有将其进行初始化,那么它得到的就是基本类型的标准初值。如果是一个对象引用,那么除非新创建一个对象,并指派给该引用,否则它就是空值(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变量;