有关静态数据的初始化

1.初始化顺序是先静态对象(如果它们尚未因前面的对象创建过程而被初始化),而后非静态对象。如果在main方法中存在静态域对象,则这些静态域对象对应的所有类在main方法开始之前都会被加载。
  
  2.静态初始化只有在必要的时刻才会进行。如果某静态对象存在于某个类中,只有这个类的对象被创建(或者第一次访问静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化。
  
  3.在JVM载入类文件的时候,有关初始化的所有动作都会执行。因此,静态初始化只在class对象首次加载的时候进行一次。注意,如果没有显示地初始化静态变量,它们会已经在类文件第一次在被加载的时候被初始化。
  
  4.看下面的程序:
  
  

public class Singleton
 {
   
   int counter4=0;
   static Singleton obj=new Singleton();
   static int counter1;
   static int counter2=0;
   int counter3=0;
   public Singleton()
   {
      counter1++;
      counter2++;
      counter3++;
      System.out.println("Singleton()");
   }
   
   public static void main(String[] args)
   {
      System.out.println("counter1="+Singleton.counter1);
      System.out.println("counter2="+Singleton.counter2);
      System.out.println("counter3="+obj.counter3);
   }
  
}

   
由于Singleton中定义了静态对象,所以程序会先初始化静态对象,执行构造器,由于counter3和counter4都进行了显示初始化,所以在执行构造器之前会前执行counter4=0和counter3=0这两条语句,接着在执行构造器,构造器执行完后接着执行static int counter2=0这条语句,由于在构造器中counter1、counter2进行了运算(counter1已经被初始化为0),运算后它们的结果都为1,但是由于构造器执行完毕后接着在执行static int counter2=0,所以最后打印出来的出来的结果为:
  
 

/* Output:

   Singleton()
  counter1=1
  counter2=0
  counter3=1

*///:~

   
  注意counter2的值为0,而不是1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值