如下一个简单的单态类,其中有一个成员变量strMember,如果将其定义为非静态的,则结果正常,为aaa;如果定义为static,且放在实例对象instance之前,结果也正常;但放在之后,结果为"".
这种情况不知如何解释。是不是跟类的初始化的机制有关系? 先谢过了public class TestSingleton
{
private static TestSingleton instance = new TestSingleton();
public static String strMember = ""; //位置不同,结果不同
private TestSingleton()
{
strMember = "aaaa";
System.out.println("constructor strMember=" + strMember);
}
public static TestSingleton getInstance()
{
return instance;
}
public String getMember()
{
System.out.println("strMember=" + strMember);
return strMember;
}
public static void main(String[] arg)
{
getInstance().getMember();
}
}
这种情况不知如何解释。是不是跟类的初始化的机制有关系? 先谢过了public class TestSingleton
{
private static TestSingleton instance = new TestSingleton();
public static String strMember = ""; //位置不同,结果不同
private TestSingleton()
{
strMember = "aaaa";
System.out.println("constructor strMember=" + strMember);
}
public static TestSingleton getInstance()
{
return instance;
}
public String getMember()
{
System.out.println("strMember=" + strMember);
return strMember;
}
public static void main(String[] arg)
{
getInstance().getMember();
}
}
//1)当类装入内存时,static 变量instance与strMember都默认初始化为nullprivate static TestSingleton instance = new TestSingleton();
//2) 然后对static TestSingleton 赋值,
//执行new TestSingleton(),[即执行构造器TestSingleton()]
//执行TestSingleton()时已将:strMember赋值为:"aaa"了public static String strMember = ""; //位置不同,结果不同
//3)然后再执行该句,对static String strMember 再赋值.
//此时:strMember值已由"aaa"变成了""了.
public class TestStatic {
private static int a; static {
a = 10;
System.out.println(a);
} static {
a = 20;
System.out.println(a);
}
}class TestIt {
public static void main(String[] args) {
TestStatic st = new TestStatic();
}
}
private static TestSingleton instance = new TestSingleton(); 这句就是罪魁祸首!他在第一句静态初始化过程里,做了非静态的工作。