作者FET (FET)
看板java
標題Re: [問題] primitive與refernce的問題
時間Thu Jul 2 14:08:15 2009
※ 引述《adrianshum (Alien)》之銘言:
: ※ 引述《crazykai (Gooday)》之銘言:
: : 最近在看Head First Java,想不到才看到第三章就卡住了
: : 我的疑問是這樣的
: : primitive因為是以位元組表達實際變數值,因此不用另外宣告實體
: : 而物件的參考變數只是類似指標作用,因此還需宣告實體
: : 但String是個物件呀,為什麼我們不會寫
: : String name = new String();
: : name = "crazykai"
: : 請大大們有空指導一下吧 <(_ _)>
: 對於 reference 來說, 你可以想成 = 是指把該 reference
: 指向某 obj instance.
: 第二句是 name 這 reference 指向 "crazykai" 這
: 個 string literal 而已. string literal 本身也是一個
: object.
: 你上面兩句實際是發生這樣的事
: (String name= new String())
: 1) 生成 String()
: +--- String -----+
: +----------------+
: | |
: [name] +----------------+
: 2) name = 該新 String obj
: +--- String -----+
: +----------------+
: --->| |
: [name] --/ +----------------+
: (name = "crazykai")
: 3) name 指外另一 string object
: +--- String -----+
: +----------------+
: | |
: [name] -- +----------------+
: \
: \ +--- String -----+
: \-------> +----------------+
: | "crazykai" |
: +----------------+
: 和你認知的沒有分別. 只是 String object 生成的方法
: 不必一定要乖乖寫 new String(), 而是單純寫 "balblabal"
: 就等如是 new 了一個 String instance.
: (其實這樣說不太正確, 因為 string literal 的情況, 是在
: 程式一開始就已經存在那些 string literal 的 String obj
: instance, 而不是用的那刻才 new. 不過簡化一點來說你應
: 該會比較容易理解)
大大畫得超好
我的想法只有第三個有點不同
3) name 指外另一 string object
+--- String -----+
+----------------+
| |
[name] -- +----------------+
\
\ +--- String -----+
\-------> +----------------+
| "crazykai" |
+----------------+
^^^^^^^^^^^^^^^^^^此區塊為String pool
String object好像是用成一個pool
所有的String object建立起來就丟在裡面
這個狀況下沒有什麼差別
可是如果後來又要呼叫到"crazykai"
其實是指到String pool裡面已經創造好的這個物件
並不會再重新new一個記憶體空間
希望有幫到忙^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.17.93
→ adrianshum:我文章最後面補充的就是在說這了.. 07/02 14:30
→ lalawugaga:在memory model裡,只有stack跟heap兩塊,物件在heap 07/02 16:22
→ adrianshum:對一個初學者說 stack/heap, 一點幫助也沒有耶... 07/03 10:46