日期:2014-05-20  浏览次数:20815 次

请教,这段代码为什么会4次调用构造器?
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);
}
}

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