若数据是静态的(static),那么同样的事情就会发生;如果它属于一个基本类型(主类型),而且未对其初始化,就会自动获得自己的标准基本类型初始值;如果它是指向一个对象的句柄,那么除非新建一个对象,并将句柄同它连接起来,否则就会得到一个空值(NULL)。
如果想在定义的同时进行初始化,采取的方法与非静态值表面看起来是相同的。但由于static值只有一个存储区域,所以无论创建多少个对象,都必然会遇到何时对那个存储区域进行初始化的问题。下面这个例子可将这个问题说更清楚一些:
//
: StaticInitialization.java
// Specifying initial values in a
// class definition.
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();
} // /:~
// Specifying initial values in a
// class definition.
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允许我们检查一个类的创建过程,而Table和Cupboard能创建散布于类定义中的Bowl的static成员。注意在static定义之前,Cupboard先创建了一个非static的Bowl b3。它的输出结果如下:
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 )
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 )
static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用Table.b1或Table.b2,那么static Bowl b1和b2永远都不会创建。然而,只有在创建了第一个Table对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static对象。大家可从输出结果中找到相应的证据。