java 板


LINE

※ 引述《birdy1147 (Allen)》之銘言: : 不好意思,想問個比較基礎的問題,我知道題意是要考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過以後,指派給新的物件,應該會是不相關的兩個 : 物件? 你從結果推測出的想法是對的, static field會留下來,instance的field才會重來。 首先,你知道全域變數的話,我猜你可能學過C之類的語言吧? 但在Java中不管是static field還是物件的field都不叫做全域變數, field在中文有些人翻譯成「成員變數」。 不只是開發者取的名字不一樣而已,而是連本質都不一樣。 首先講non-static field這部分跟你說的一樣, 每new一次就會指派新的記憶體空間來存放, 所以每個新產生出來的物件內的變數都不會干擾。 再來是static的部分,我想這部分你誤會了, 以你的敘述來看,應該是把他當成了跟物件內成員變數一樣, 每new一個就會有一個獨立的空間,互不干擾吧? 但這樣不就會變得跟non-static field一樣了嗎? 又何必分成兩種呢? static的特點是「在記憶體中只有一個」, 而且「不用new,打從一開始就存在」。 所以你才會看到變數s的內容一直沒改變。 我不知道你的程式碼是哪裡來的, 但那樣會令人不好理解static與non-static的差別。 我再寫個簡單的範例給你看看兩者個差別。 public class Test{ private static int count; // 紀錄數量 private int number; // 紀錄自己的號碼 public Test(int num){ number=num; count++; } public void print(){ System.out.println("我是"+number +"號,目前加上我已產生"+count+"跟我一樣的物件"); } public static void main(String[] args){ new Test(20).print(); new Test(30).print(); new Test(50).print(); } } 編譯後會輸出: 我是20號,目前加上我已經產生了1個跟我一樣的物件 我是30號,目前加上我已經產生了2個跟我一樣的物件 我是50號,目前加上我已經產生了3個跟我一樣的物件 你會看到我們new了三個Test類別所產生的物件, 三個物件都記得自己被賦予的number。 但count則不一樣,count變數是static的, 不管new了幾次都是共用一個記憶體位置。 所以每呼叫一次就會在建構子內將原本的數字加一, 運用這個特性就產生了紀錄有幾個Test物件的效果。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.178.168
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1468426564.A.D7A.html
1F:推 smallmac: 推講解 07/14 13:54
2F:推 quadro: number=num; 07/14 14:03
感謝提醒!
3F:推 birdy1147: 謝謝,你解釋得很清楚,我有比較懂了 07/15 18:35
不客氣,其實這是我第一次發表文章與編輯回文XD
4F:推 charlie1081: 長知識了謝~ 07/28 12:10
5F:推 poolongkong: 補充一點,static連宣告都不用就會存在,可以試試 07/30 12:19
6F:→ poolongkong: 看在第一行直接print static變數,並不會有error 07/30 12:19
7F:→ poolongkong: Test.count 07/30 12:20
8F:→ poolongkong: 啊 不過好像需要給初始值 07/30 12:20
field的數字預設是0、物件預設是null 所以我的count的確沒有設初始值
9F:→ ssccg: local變數才需要初值,instance、static都有預設值 07/31 04:26
※ 編輯: kyleJ (220.132.178.168), 08/15/2016 23:27:25







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP