class Single{
       //一加载类,对象就已经存在了
       private static Single s = new Single();       private Single(){}       public static Single getInstance(){
             return s ;
      }
}class SingleDemo{
       public static void main(String[] args){
            Single s1 = Single.getInstance();
            Single s2 = Single. getInstance();
            System.out.println(s1 == s2);
      }
}对单例设计模式,一直有好些个疑惑没有解开......类都没有写完,都没有出花括号!怎么能在还没写完自己的时候,就用自己呢?
类加载中,怎么还能new对象,建立对象不是类加载完后的事吗?如果是这样的话,我能不能在这个静态方法里调用this,它这里有对象,是不是也就有this!像这个,还有递归,等等...它们一次又一次挑战自己理解的底线,每次看到这些,大脑中的本能反应就是“怎么还可以这样!”

解决方案 »

  1.   

    看一下《深入JAVA虚拟机》就能解决你的谜团。
      

  2.   

    了解一下编译原理就知道了,如果能够学习JVM那是最好!!!JVM在将类加载进入虚拟机中执行前,你所写的java代码已经被编译为java字节码,其中的代码已经进行了优化,如果感兴趣你可以使用 javap 指令进行查看!!!!
      

  3.   

    因为new 一个对象的时候会把这个对象的类加载到内存,static代码片段会自动执行,也就是会生成属性对象实例,你的实例方法只是返回这个属性而已,每次创建其实就是每次返回加载类时给你生成的实例属性对象
      

  4.   

    首先程序既然运行,就说明类已经写好了,this指当前对象,不能和static共存静态属性静态方法都不能用this,因为static不依靠对象调用,同时类只加载一次,静态属性和静态方法存在于永久区和对象没有半毛钱的关系这里只是在GC区new了一个对象然后把对象的引用也就是地址赋给了Single类型的引用变量s,至于递归,类里面new对象就一个构造器能用,而构造器里啥都没有,不会递归,这段代码private static Single s = new Single();在new对象的时候根本没用,因为它是静态的
      

  5.   

    没看懂你想说什么
    类加载时会对静态变量进行初始化
    private static Single s = new Single();
    而初始化时会间接初始化对象
    这个new并不会创建变量s,不会去管理静态变量,也不会去调用除构造函数以外的任何方法(除非构造函数里去调了其他方法)
    只会引起非静态变量的初始化,这里没有,所以你可以认为new了一个没数据的对象而已
    而这个对象的引用是又s持有的
      

  6.   

    去看看深入JAVA虚拟机这本书吧。我还没有看完。
      

  7.   

    楼主适合去学Basic之类的逐行编译的语言
      

  8.   

    thinking in java讲过,很多书应该都讲过,这个问题其实蛮常见的吧。21天精通这类的书就算了,好好看本好书应该就懂了