public class OrderTest {


static  OrderTest ort=new OrderTest();//1
static int s1;
static int s2=2;

OrderTest(){
s1++;
s2++;
} public static void main(String[] args) {
    System.out.println("s1="+s1+" s2="+s2);
  }}
各位看看最終的輸出結果會是什么?能夠幫忙解釋下上面的Static 靜態變量的附值順序!謝謝.

解决方案 »

  1.   

    先分配s1,s2的物理空间,然后走构造函数,此时s1=1,s2=1.再把s2的值赋给s2变量.
      

  2.   

    也就是说static变量先分配地址,再逐一赋值.有不对地方,请高手们指教.
      

  3.   

    由结果就可以想到啊:
    static 变量是类加载时给他分配空间,并不附值.
    然后你new出了对象,调用了构造方法,这时候s1=1,s2=1.
    然后再给s2附值为2的吧.
    具体JVM怎么走的也不清楚,只是个人猜想=.=
      

  4.   

    首先,在调用main方法前,所有的静态属性 都必须赋值。
    所以先执行
    static  OrderTest ort=new OrderTest();//1 
    static int s1; 
    static int s2=2; 
    这三句。
    其次,上述三句的执行顺序是从上到下:
    先执行static  OrderTest ort=new OrderTest(),在OrderTest()中调用s1和s2时初始值为0,然后变为1。
    然后执行static int s1,因为只是定义(分配内存)而没有赋值,而此时s1在内存中已经存在所以是s1仍然是1。
    最后执行static int s2=2,由于存在赋值语句所以s2被赋值为2。
    因此结果为s1=1 s2=2。
    不过值得注意的的是如果static int s2=2语句出现在static  OrderTest ort=new OrderTest()语句之前,那么结果就变为s1=1 s2=3。因为在调用构造方法之前s2已经赋值为2了,执行了构造方法后就变成3。
    不信可以测试一下。public class OrderTest { 
    OrderTest(){ 
    s1++; 
    s2++; 
    } public static void main(String[] args) { 
        System.out.println("s1="+s1+" s2="+s2); 

    static int s2=2; 
    static  OrderTest ort=new OrderTest();//1 
    static int s1; 
      

  5.   

    謝謝6樓的分析﹐其實我的問題是集中在1>.當执行static  OrderTest ort=new OrderTest(),在OrderTest()中调用s1和s2时初始值为0為何是0?是因為所有成員變量初始化都應該為0嗎?
    2>.执行static int s1 為什么只是定義(分配内存)而没有赋值?按上面說法不是初始化都應該附0嗎?謝謝~