[問題] 建構子與static 變數

作者: birdy1147 (Allen)   2016-07-13 11:04:27
不好意思,想問個比較基礎的問題,我知道題意是要考static與 non-static,但我看了
很久都想不通,如下:
class Ans{
int ns;
static int s;
Ans(int ns){
if(s<ns){
s=ns;
this.ns=ns;
}
}
void print( ){
system.out.println(“ns= ”+ns+“ s= ”+s);
}
}
public class Test{
public static void main(String[ ] args){
Ans a = new Ans(50);
Ans b = new Ans(125);
Ans c = new Ans(100);
a.print( );
b.print( );
c.print( );
}
}
我以為結果會是 ns=50 s=50
ns=125 s=125
ns=100 s=100
但結果是 ns=50 s=125
ns=125 s=125
ns=0 s=125
我知道全域變數int在沒有設定的情況下,系統會預設為0
所以在new Ans(50);時,經過if判斷式,會被兩個變數設為50
所以我以為答案是我想的那樣,
但從正確答案看來,static int s;會留著之前的50,而int ns;卻會重新歸0
想請問這是為什麼呢?我以為重新new過以後,指派給新的物件,應該會是不相關的兩個
物件?
作者: mars90226 (火星人)   2016-07-13 11:27:00
你這貼上來的code有很多小錯誤,然後我直接結果是ns= 50 s= 125; ns= 125 s= 125; ns= 125 s= 125static變數就是屬於class的,所以同個class的instance用到的static變數是同一個,所以自然不會歸0貼錯,最後一行是ns= 0 s= 125
作者: ssccg (23)   2016-07-13 11:32:00
你知道題意是要考static和non-static,可是你看起來好像完全不懂static,不先重新搞清楚嗎static就是屬於class不屬於instance,new幾個instance都跟static欄位沒有關係另外嚴格說起來java沒有全域變數(global variable),只有class variable(static)和instance variable(non-static)
作者: kniver999 (小囧)   2016-07-13 20:47:00
因為把c new出來的時候,傳進建構式的100並沒有比當前的s(125)還大,所以不會進到if裡面去執行,c的ns就保留初值0了
作者: kyleJ (資工人)   2016-07-13 23:05:00
其實你的問題上面真的都回答完了 只是你眼睛閉上說那是假的沒去看 static不是C那種全域變數的概念 而物件new多少個出來 static的內容都會共用
作者: ssccg (23)   2016-07-14 00:25:00
從你問的問題看起來你就是沒懂啊..一開始 Ans.s 等於 0Ans a = Ans(50) // 0<50,所以結果Ans.s=50,a.ns=50Ans b = Ans(125) // 50<125,所以結果Ans.s=125,b.ns=125Ans c = Ans(100) //125>100,所以結果Ans.s不變,c.ns為0所謂不管new幾個變數都跟static欄位沒關,所以static欄位一直是同一個,不管在哪個new Ans()裡面呼叫都是同一個"為什麼之後new的變數還要受到影響",Ans()裡面就拿Ans.s來用,要怎麼不受影響? 程式寫怎樣不就怎樣最後print時Ans.s也都是同一個,所以都印出s=125如果你真的還看不懂,就把程式裡用到s的地方都改成Ans.s再看一次,跟this.ns就差在一個屬於instance一個屬於class
作者: nmbalance   2016-07-15 16:24:00
我剛學Java一個月都懂前面推文大大辛苦仔細的解說,請發文者先認真搞清楚好嗎,不要自己不懂就一直覺得是別人解釋不清楚
作者: ssccg (23)   2016-07-15 18:34:00
一個class只會被load一次,不管從哪個class呼叫都是同一個除非用自訂的ClassLoader去管理class載入,不過我想這不在基礎範圍了,通常使用就是不會重新載入了
作者: gmoz ( This can't do that. )   2016-07-18 11:10:00
阿宣告成static就是只有一個阿,全部同class的instance共用當有多數人都用同樣的方式回答你 你就要想看看是不是自己錯了 不要堅持己見這個邏輯同樣可套用在抓bug上 共勉之
作者: allen8952   2016-07-25 00:48:00
就我的想法來看,你創造三個物件,可是你在第三次創造的時候就已經把static設定為125了所以不管怎麼樣s一定是抓到125你創造新的東西會被歸零的是妳沒有設定static 的第三個print出來的ns會為零就是你在創造物件時,判斷式就不會通過因為125<100是false ,ns就視為零以上是我個人見解,自學java一個月也是我第一個語言,覺得很好玩

Links booklink

Contact Us: admin [ a t ] ucptt.com