public class StaticVariableTest {     
    private static StaticVariableTest svt = new StaticVariableTest();//语句(1)  
    private int count1=5;//语句(2)   
    private static int count2=6;//语句(3)  
   
       
    private StaticVariableTest(){//语句(4)   
        count1++;   
        count2++;   
    }   
    public static StaticVariableTest getInstance(){//语句(5)   
        return svt;   
    }   
    public  int getCount1() {   
        return count1;   
    }   
    public  void setCount1(int count1) {   
        this.count1 = count1;   
    }   
    public static int getCount2() {   
        return count2;   
    }   
    public static void setCount2(int count2) {   
        StaticVariableTest.count2 = count2;   
    }   
    public static void main(String[] args) {   
        StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)   
        System.out.println("count1:" + svt.getCount1());//语句(7)   
        System.out.println("count1:" + svt.getCount2());//语句(8)   
    }   
}  
对比下面一个
public class StaticVariableTest {     
    private static StaticVariableTest svt = new StaticVariableTest();//语句(1)  
    private static int count1=5;//语句(2)   
    private static int count2=6;//语句(3)  
   
       
    private StaticVariableTest(){//语句(4)   
        count1++;   
        count2++;   
    }   
    public static StaticVariableTest getInstance(){//语句(5)   
        return svt;   
    }   
    public  static int getCount1() {   
        return count1;   
    }   
    public  static setCount1(int count1) {   
         StaticVariableTest.count1 = count1;   
    }   
    public static int getCount2() {   
        return count2;   
    }   
    public static void setCount2(int count2) {   
        StaticVariableTest.count2 = count2;   
    }   
    public static void main(String[] args) {   
        StaticVariableTest svt = StaticVariableTest.getInstance();//语句(6)   
        System.out.println("count1:" + svt.getCount1());//语句(7)   
        System.out.println("count1:" + svt.getCount2());//语句(8)   
    }   
}  

解决方案 »

  1.   

    顺序:静态变量,实例变量静态变量是类装载时就分配了空间,并且是共享的一段空间
    main()方法 是静态的 所以先执行 main()
      

  2.   

    经过编译器的优化之后:public class Test {    
        private static Test svt;
        private int count1;
        private static int count2;
        static{
         svt = new Test();//调用构造函数,此时,count1=6;count2=1;
         count2=6;//
         }
          
        private Test(){//
            count1=5;
            count1++;  
            count2++;  
        }  
      

  3.   

    把count1=5;放置在构造函数里边。
      

  4.   

    呵呵,可能楼上误解我的意思了.我就是想问一下为什么
    public static int count1=5;
    为什么有static没有它执行的结果会不一样?谢谢
      

  5.   

    经过编译器优化之后,有没有static的区别不是很明显吗?
    你的第一个例子不已经包含了两种情况,一种是有static(count2),一种没有static(count1),
    这个清楚,第二题不就明白了
      

  6.   

    因为static造成执行顺序不一样,结果当然也就不一样啊。
    顺序:静态变量-》实例变量-》构造方法第一个例子:
    首先试图初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();
    但是在构造方法执行之前必须先初始化实例变量count1,于是先跑去执行语句(2),于是count1=5;
    之后回来继续执行构造方法,于是count1加1变成6,count2由0变成1;
    接下来轮到语句(3),于是count2重新被赋值变成6;
    在接下来语句(6)(7)(8)取值,打印,
    所以结果:6,6第二个例子:
    不同的地方是,初始化静态变量svt,结果碰到了=后边的构造方法:new StaticVariableTest();时,不是再跑去先执行语句(2),因为此时的count1已经不是实例变量了,而是直接就去执行构造方法,于是count1,count2都由0变成了1。
    接下来顺序执行语句(2)(3),于是count1,count2分别被重新赋值变成5,6
    剩下的语句就是取值,打印
    所以结果:5,6
      

  7.   

    以楼主顺序的话,构造函数是要实例化实例变量,但是实例化实例变量前,要先加载静态变量的啊?于是count1加1变成6,count2由6变成7;呵呵,麻烦解答下
      

  8.   

    如果你从类的生命周期,包括类的装载,连接,初始化,来解释,很麻烦。
    你可以使用反编译工具 jad 看看。
      

  9.   

    over了,我的脑袋瓜被你弄成糨糊了 
      

  10.   

    呵呵,我用jad反编译工具,果然是个好东西.实例变量在实例化前一定要初始化,但是静态变量与他们没有直接的关系