作者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
1F:→ adrianshum:我文章最後面补充的就是在说这了.. 07/02 14:30
2F:→ lalawugaga:在memory model里,只有stack跟heap两块,物件在heap 07/02 16:22
3F:→ adrianshum:对一个初学者说 stack/heap, 一点帮助也没有耶... 07/03 10:46