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 靜態變量的附值順序!謝謝.
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 靜態變量的附值順序!謝謝.
static 变量是类加载时给他分配空间,并不附值.
然后你new出了对象,调用了构造方法,这时候s1=1,s2=1.
然后再给s2附值为2的吧.
具体JVM怎么走的也不清楚,只是个人猜想=.=
所以先执行
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;
}
2>.执行static int s1 為什么只是定義(分配内存)而没有赋值?按上面說法不是初始化都應該附0嗎?謝謝~