public class SingletonTest {
 
 private static SingletonTest singleton = new SingletonTest();
 
 private SingletonTest(){
  System.out.println("构造函数调用");
 }
 
 public static SingletonTest getInstance(){
  return singleton;
 }
 
 public static void main(String[] args) {
  SingletonTest single = SingletonTest.getInstance();
  SingletonTest single2 = SingletonTest.getInstance();
  System.out.println(single == single2);
 }
}
上面这段代码,输出结果为:构造函数调用
true但是不明白,类加载首先加载静态变量,明明两个对象是new了两次,为啥构造函数只调用了一次呢,求解 
菜鸟,对类加载不太明了,期待高手指点,谢过了

解决方案 »

  1.   

    private static SingletonTest singleton = new SingletonTest();
    明明只有一个new嘛,所以只调用了一次构造方法啊SingletonTest single = SingletonTest.getInstance();
    SingletonTest single2 = SingletonTest.getInstance();
    这是静态方法的调用、调用静态方法不会调用构造方法的如果你的类的开头没有写
    private static SingletonTest singleton = new SingletonTest();
    而是
    private static SingletonTest singleton = null;
    的话,你这个程序连一次构造方法都不会调用到
      

  2.   

    哪里new了两次?
    搜遍了也只有一个new:
    private static SingletonTest singleton = new SingletonTest();
      

  3.   

    那当我第二次调用getInstance方法的时候,是直接返回一个实例,这个实例是哪里来的呢?
      

  4.   

    SingletonTest single = SingletonTest.getInstance();
    是不是类加载只做一次,所以
    private static SingletonTest singleton = new SingletonTest();只执行一次,
    静态变量也只加载一次?
      

  5.   

    private static SingletonTest singleton
    就是靠的这一半声明来的
    你在类中声明了一个对象getInstance返回给你的就是这个对象
    至于这个对象有没有实例化,那getInstance可不管楼主你把第一行改成
    private static SingletonTest singleton;
    试试就明白了就是没有实例化,它也一样返回给你
      

  6.   

    之所以你的这段程序还能调用到一次构造方法
    完全是因为你写了
    private static SingletonTest singleton = new SingletonTest();
    这叫变量声明(可以同时初始化)
    JAVA程序执行时,会把main方法所在类的变量声明部分全部执行的
      

  7.   

    只new了一次.   这是单例.   new了之后,如果你还要使用的话,就不会new了. 这就是单例
      

  8.   

    static的东西属于类而不属于对象,这个类的所有对象共享一份实例
      

  9.   

    建议楼主去看一看thinking in java,一本不错的java书,里面讲得很详细。
      

  10.   

    在java很多书籍里都有写到,某一个类的静态变量,对于该类的任一实例都只会拥有同一个指向对象,因为你的静态变量不是后期实例化的,因此该静态变量的实例将在该类被加载的时候进行,而且只进行一次,以后无论是否该类再调用构造方法进行初始化, 其静态域也只会指向一个对象,LZ调用两次getInstanse方法都只是返回同一个在类加载时便被实例化的对象,LZ试试将main里面的内容全部去掉,你还是会打印出"构造函数调用"字样,那是因为该构造方法是在加载类的时候执行的