静态数据的初始化

若数据是静态的(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();
}
  // /:~


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 )


static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用Table.b1或Table.b2,那么static Bowl b1和b2永远都不会创建。然而,只有在创建了第一个Table对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。
初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非static对象。大家可从输出结果中找到相应的证据。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值