Java中的静态成员初始化的顺序、时间总是存在着一些迷惑。今天用以下代码验证了一下,感觉好多问题豁然贯通。
// StaticInitialize.java
// To test some details of the
// initialization of static fields.
import java.util.*;
class RandFields {
static private Random rand = new Random();
private static int a = statint();
private int b = normalint();
static private int statint() {
int i = rand.nextInt(50);
System.out.println("static initialization " + i);
return i;
}
private int normalint() {
int i = rand.nextInt(50);
System.out.println("normal initialization " + i);
return i;
}
public RandFields() {
System.out.println("this is constructor");
System.out.println("static int a = " + a +
", int b = " + b);
}
public static void print() {
System.out.println("This is static method print");
}
}
public class StaticInitialize {
public static void main(String[] args) {
RandFields.print();
RandFields rand1 = new RandFields();
RandFields rand2 = new RandFields();
}
}
以下是运行结果:
可见,如果单纯使用类中的静态方法,是不会调用构造器的。再看以下的验证:
// StaticInitialize.java
// To test some details of the
// initialization of static fields.
import java.util.*;
class RandFields {
static private Random rand = new Random();
private static int a;// = statint(); //Change here
private int b = normalint();
static private int statint() {
int i = rand.nextInt(50);
System.out.println("static initialization " + i);
return i;
}
private int normalint() {
int i = rand.nextInt(50);
System.out.println("normal initialization ");
return i;
}
public RandFields() {
System.out.println("this is constructor");
a = rand.nextInt(50); //Change here
System.out.println("static int a = " + a +
", int b = " + b);
}
public static void print() {
System.out.println("This is static method print");
System.out.println("a = " + a);//Change here
}
}
public class StaticInitialize {
public static void main(String[] args) {
RandFields.print();
RandFields rand1 = new RandFields();
RandFields rand2 = new RandFields();
}
}
以下是运行结果:
此时的静态成员在构造器中初始化,则每次会有不同的值,但是,所有的对象是共享一个静态成员的。