[問題] 建構子與static 變數

看板java作者 (Allen)時間8年前 (2016/07/13 11:04), 8年前編輯推噓2(2045)
留言47則, 7人參與, 最新討論串1/2 (看更多)
不好意思,想問個比較基礎的問題,我知道題意是要考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過以後,指派給新的物件,應該會是不相關的兩個 物件? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.80.31.111 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1468379069.A.DD3.html

07/13 11:27, , 1F
你這貼上來的code有很多小錯誤,然後我直接結果是
07/13 11:27, 1F

07/13 11:27, , 2F
ns= 50 s= 125; ns= 125 s= 125; ns= 125 s= 125
07/13 11:27, 2F

07/13 11:28, , 3F
static變數就是屬於class的,所以同個class的instance
07/13 11:28, 3F

07/13 11:28, , 4F
用到的static變數是同一個,所以自然不會歸0
07/13 11:28, 4F

07/13 11:28, , 5F
貼錯,最後一行是ns= 0 s= 125
07/13 11:28, 5F
這是我用手機打的,有的符號跟字母按錯,更正了

07/13 11:32, , 6F
你知道題意是要考static和non-static,可是你看起來好像完
07/13 11:32, 6F

07/13 11:34, , 7F
全不懂static,不先重新搞清楚嗎
07/13 11:34, 7F

07/13 11:37, , 8F
static就是屬於class不屬於instance,new幾個instance都跟
07/13 11:37, 8F

07/13 11:39, , 9F
static欄位沒有關係
07/13 11:39, 9F

07/13 11:42, , 10F
另外嚴格說起來java沒有全域變數(global variable),只有
07/13 11:42, 10F

07/13 11:43, , 11F
class variable(static)和instance variable(non-static)
07/13 11:43, 11F
你說的我都懂啊,我想問的是,在第一次new了a帶入50後,接著再new b 為什麼還要跟50 比,如果new幾個instance都跟static欄位沒有關係,那為什麼之後new的變數還要受到影 響?

07/13 20:47, , 12F
因為把c new出來的時候,傳進建構式的100並沒有比當前
07/13 20:47, 12F

07/13 20:48, , 13F
的s(125)還大,所以不會進到if裡面去執行,c的ns就保留
07/13 20:48, 13F

07/13 20:48, , 14F
初值0了
07/13 20:48, 14F
這些流程我知道,我想問的是上面打的那樣 ※ 編輯: birdy1147 (111.80.31.111), 07/13/2016 21:45:06

07/13 23:05, , 15F
其實你的問題上面真的都回答完了 只是你眼睛閉上說那是假
07/13 23:05, 15F

07/13 23:05, , 16F
的沒去看 static不是C那種全域變數的概念 而物件new多少個
07/13 23:05, 16F

07/13 23:05, , 17F
出來 static的內容都會共用
07/13 23:05, 17F
可能我表達的方式不夠好,上面回答的沒有不對,但沒有釐清到我不懂的地方,而不是什 麼我閉上眼睛說那是假的....

07/14 00:25, , 18F
從你問的問題看起來你就是沒懂啊..
07/14 00:25, 18F

07/14 00:27, , 19F
一開始 Ans.s 等於 0
07/14 00:27, 19F

07/14 00:28, , 20F
Ans a = Ans(50) // 0<50,所以結果Ans.s=50,a.ns=50
07/14 00:28, 20F

07/14 00:30, , 21F
Ans b = Ans(125) // 50<125,所以結果Ans.s=125,b.ns=125
07/14 00:30, 21F

07/14 00:31, , 22F
Ans c = Ans(100) //125>100,所以結果Ans.s不變,c.ns為0
07/14 00:31, 22F

07/14 00:32, , 23F
所謂不管new幾個變數都跟static欄位沒關,所以static欄位一
07/14 00:32, 23F

07/14 00:34, , 24F
直是同一個,不管在哪個new Ans()裡面呼叫都是同一個
07/14 00:34, 24F

07/14 00:34, , 25F
"為什麼之後new的變數還要受到影響",Ans()裡面就拿Ans.s
07/14 00:34, 25F

07/14 00:35, , 26F
來用,要怎麼不受影響? 程式寫怎樣不就怎樣
07/14 00:35, 26F

07/14 00:39, , 27F
最後print時Ans.s也都是同一個,所以都印出s=125
07/14 00:39, 27F

07/14 00:39, , 28F
如果你真的還看不懂,就把程式裡用到s的地方都改成Ans.s再
07/14 00:39, 28F

07/14 00:40, , 29F
看一次,跟this.ns就差在一個屬於instance一個屬於class
07/14 00:40, 29F
是我沒有表達清楚我的問題,謝謝你耐心的回應,有比較釐清我不了解的地方了,那如果 換了一個class呼叫Ans,才是等於從新載入嗎?

07/15 16:24, , 30F
我剛學Java一個月都懂前面推文大大辛苦仔細的解說,請
07/15 16:24, 30F

07/15 16:24, , 31F
發文者先認真搞清楚好嗎,不要自己不懂就一直覺得是別
07/15 16:24, 31F

07/15 16:24, , 32F
人解釋不清楚
07/15 16:24, 32F
少拍馬屁,你才是搞清楚好嗎?我並沒有說別人解釋得不清楚 ※ 編輯: birdy1147 (111.80.12.91), 07/15/2016 18:23:21

07/15 18:34, , 33F
一個class只會被load一次,不管從哪個class呼叫都是同一個
07/15 18:34, 33F

07/15 18:43, , 34F
除非用自訂的ClassLoader去管理class載入,不過我想這不在
07/15 18:43, 34F

07/15 18:44, , 35F
基礎範圍了,通常使用就是不會重新載入了
07/15 18:44, 35F

07/18 11:10, , 36F
阿宣告成static就是只有一個阿,全部同class的instance共用
07/18 11:10, 36F

07/18 11:12, , 37F
當有多數人都用同樣的方式回答你 你就要想看看是不是自己
07/18 11:12, 37F

07/18 11:12, , 38F
錯了 不要堅持己見
07/18 11:12, 38F

07/18 11:12, , 39F
這個邏輯同樣可套用在抓bug上 共勉之
07/18 11:12, 39F

07/25 00:48, , 40F
就我的想法來看,你創造三個物件,可是你在第三次創
07/25 00:48, 40F

07/25 00:48, , 41F
造的時候就已經把static設定為125了所以不管怎麼樣s
07/25 00:48, 41F

07/25 00:48, , 42F
一定是抓到125
07/25 00:48, 42F

07/25 00:51, , 43F
你創造新的東西會被歸零的是妳沒有設定static 的
07/25 00:51, 43F

07/25 00:55, , 44F
第三個print出來的ns會為零就是你在創造物件時,判斷
07/25 00:55, 44F

07/25 00:55, , 45F
式就不會通過因為125<100是false ,ns就視為零
07/25 00:55, 45F

07/25 00:57, , 46F
以上是我個人見解,自學java一個月也是我第一個語言
07/25 00:57, 46F

07/25 00:57, , 47F
,覺得很好玩
07/25 00:57, 47F
文章代碼(AID): #1NXQ-ztJ (java)
討論串 (同標題文章)
文章代碼(AID): #1NXQ-ztJ (java)