class DanTai{
static DanTai Dan = new DanTai();
                  int i = 0;
private DanTai()
{
    System.out.println("DanTai");
}
public static DanTai Fanhui()
{
    return Dan;
}
}
public class Dantaimoshi{
public static void main(String[] args)
{
   System.out.println(DanTai.Fanhui().i);
}

我们给静态变量dan赋值的时候应该是只赋值一次,但是我有点不太明白。
当给dan赋值的时候 会产生一个新的DanTai对象,同时又产生一个静态的dan变量,我知道静态变量是共享一块内存的,所以认为每次产生的静态变量都是同一块内存,而dan的值是不断被新的句柄覆盖。我知道这种想法是错的,请各位知情者告知原因,尽量详细点 小弟谢了

解决方案 »

  1.   

    DanTai被加载后生成Class对象,同时对静态成员进行初始化,此时生成DanTai实例对象.
    由于DanTai被加载一次,而DanTai的构造器为私有的,故能保证DanTai类实例对象只有一个,通过公有接口Fanhui返回.
    由于Dan为静态在DanTai类加载后就被初始化了,这先于构造器的初始化,故不会造成递归调用构造器.
    dan值在程序整过过程中都不会被改变,始终指向静态初始化时候赋予的实例对象.就这么多,供参考,不知道我说清楚了没有!
      

  2.   

    单例说白了就是不能通过new 来新建一个对象,所以它的构造函数都是私有的
    这 就使得单例无法被继承,外部函数通过特定的方法获取单力类,是不会产生新得单力实例的
      

  3.   

    哦 谢谢各位。。群里的一个兄弟已经让我想明白怎么回事了
    问一下hbyufan() 兄:由于Dan为静态在DanTai类加载后就被初始化了,这先于构造器的初始化,故不会造成递归调用构造器. 可是Dan在类加载的时候初始化 也要调用构造器啊不然怎么初始化? 那么说 如果去掉static Dan是什么时候初始化的那?应该也是在类的加载的时候初始化的把? 然后反复的给新对象的Dan变量初始化。
    你的意思 不确定原理对不对?不过还是谢谢你。