如下一个简单的单态类,其中有一个成员变量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();


}

}

解决方案 »

  1.   

    第一次使用到某个类时(这里就是调用getInstance()方法)会依次初始化静态成员变量我是这样想的:)学习学习
      

  2.   

    debug的过程中会报source not found
      

  3.   

    答:这种情况很好解释:见下列你的代码中的解释:
    //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"变成了""了.
      

  4.   

    类在加载的时候,会从上往下按顺序初始化静态成员,和执行静态代码块原理一样,楼主运行一下这个程序就明白了。
    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();
        }
    }
      

  5.   

    3 楼正确
    private static TestSingleton instance = new TestSingleton(); 这句就是罪魁祸首!他在第一句静态初始化过程里,做了非静态的工作。