无意中看到这样一个程序段:
class Singleton {  
   
 private static Singleton obj = new Singleton();  
   
 public static int counter1;  
   
 public static int counter2 = 0;  
   
 private Singleton() {  
   
  counter1++;  
   
  counter2++;  
   
 }  
   
 public static Singleton getInstance() {  
   
  return obj;  
   
 }  
   
}  
public class MyMain {  
   
 public static void main(String[] args) {  
   
  Singleton obj = Singleton.getInstance();  
   
  System.out.println("obj.counter1=="+obj.counter1);  
   
  System.out.println("obj.counter2=="+obj.counter2);  
   
 }  
   
}  
自己预期结果:
obj.counter1==1
obj.counter2==1实际运行一下得到如下结果:
obj.counter1==1
obj.counter2==0发现自己解释不了,谁来帮忙解释下这个问题。另外调整 private static Singleton obj = new Singleton();  这行代码位置,输出结果也有所不同。

解决方案 »

  1.   

    当程序执行private static Singleton obj = new Singleton(); 句的时候就去调用了Singleton构造器,此时counter1、counter2都是1,但是接着执行向下执行:public static int counter1;时将1赋给counter1,执行public static int counter2 = 0;时重新给counter2赋值为0
      

  2.   


    Singleton 的静态变量 counter1,counter2 以及静态引用obj 的初始化都是在类加载的时候就初始化完成了吧,应该把main方法改成下面这样
    public static void main(String[] args) { 
    System.out.println(Singleton.counter1);
    System.out.println(Singleton.counter2);
    }
    结果应该也是:
    1

    应该没错吧
      

  3.   


    lz可以试试把private static Singleton obj = new Singleton();句放到另外两个成员变量后面,看看打印结果应该就明白了
      

  4.   


    恩,谢谢,这个算是明白了,还有能不能帮你再给我解释下这个:
    public class Test{ static {  
        b = 9;  
        int i = b;// 报错  
        int j = b = 9;  
        System.out.println(b);// 报错  
    }  
    static {  
        b = 9;  
        int i = Test.b;// 不报错  
        int j = b = 9;  
        System.out.println(Test.b);// 不报错  
    }  

    static int b=0;  
    }
      

  5.   


    首先我觉得这么做没有任何意义,jdk在执行b=9;这句时会去查找是否存在该变量,实际上相当于Test.b,而int i = b;时它会认为该变量是有效的!
      

  6.   


    那这样的话,两个static块中的int j = b = 9; 岂不是也会出错?
      

  7.   

    你确定 obj.counter1 能够编译通过?
      

  8.   


    原来单例还可以这么玩,真是领教了他的意思说没有obj.counter1没有初始化就直接引用应该会编译错误
      

  9.   

    new Singleton()的时候会调用无参的构造方法.然后再赋值,最后得到结果obj.counter1=1,obj.counter2=0;
      

  10.   

    看不进去《深入java虚拟机》,也该看看《java解惑》啊,都是书本上的内容
      

  11.   

    提这个问题说明lz没有看题目,b都没有声明变量类型