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。