RT,为什么Test的构造器会被调用4次,请高人详细赐教,谢谢了import java.util.*;class Test {
Test() { System.out.println("Test()"); }
}public class Difference {
private String name;
public Difference(String s) { name = s;  } 
static final Test sft = new Test(); // constant reference address
private final Test ft = new Test();
static final String SFS = "static final"; // class constant
private final String fs = "final";
private static Random rand = new Random();
static final int SFI = rand.nextInt(); // class constant 
private final int fi = rand.nextInt();
public String toString() {
return (name + ": " + sft + ", " + ft + ", " + SFS + ", " + fs + ", " + SFI + ", " + fi);   

public static void main(String[] args) {
Difference d1 = new Difference("d1");
Difference d2 = new Difference("d2");
Difference d3 = new Difference("d3");
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
}
}

解决方案 »

  1.   

    首先,main方法在类Difference中,所以在进入main之前JVM会先加载Difference类。
    类加载时,其静态变量sft就会初始化,此时Test的构造器会被调用。而且静态变量只会初始化一次。
    是所有实例对象共有的,即使以后通过类或实例对象用到它,也不会再初始化。
    当运行到Difference d1 = new Difference("d1"); 实例对象有一个属性ft,ft要初始化,此时Test的构造器会被调用。
    由于ft不是静态的,所以每new 一个Difference,都要初始化一次。
      

  2.   

    static final Test sft = new Test() 是静态的,只初始化一次
    private final Test ft = new Test() 非静态的,每次初始化都会执行一次
    下面的代码初始化了三次,所以Test的构造器会被调用4次
      

  3.   

    多谢了,讲的很详细,很好呀。学了后面忘前面,这次对static的印象深刻了