Java 不支持 pointer
只提供 reference
初學者常常因此頗為困惑
特別是修過數據
結構的信息系學生
他們心中第一個想到的是
「沒 pointer
這怎麼成
那不就做不
出 linked list 和 tree 的數據結構?」殊不知 reference 就是一種智能型的 point
er
它具有 pointer 的好處
而且不用像 pointer 一樣要程序員自行 reference (*)
以及 dereference (&)
更不會像 pointer 一樣會誤闖內存禁區造成 crash
因為好
處多多
所以 reference 已經是現代化程序語言的重要必備功能了
什麼!你說 xx 高
級語言沒支持 reference
那你可以把它埋葬在二十世紀的歷史灰燼中
Java 對於資料的處理方式是
只要是基本型態(包括 boolean
byte
short
int
l
ong
float
double
char)一律使用 pass by value
其它型態一律 pass by refer
ence
但是我發現這在未來有可能變動
因為 Java language 將 byvalue 訂為 reser
ved word(非 keyword)
當 Java 將 byvalue 變成 keyword 之時
非基本型態的值
就可以 pass by value 了
但我相信
此時 Java 也必須開始支持 copy constructor
作為配套措施
畢竟使用 deep copy 或 shallow copy(甚至 deep 和 shallow 兼而
有之的 copy)還是要讓 programmer 決定
前面提到
只要是基本型態(包括 boolean
byte
short
int
long
float
doubl
e
char)一律使用 pass by value
其它型態一律 pass by reference
到底什麼是
pass by value?什麼又是 pass by reference 呢?打個比方
pass by value 就是資
料的「分身」傳遞過去
pass by reference 就是資料的「本尊」傳遞過去
(注
自
從 發生那件新聞
有了「本尊」和「分身」的名詞之後
我發現要向學生解釋 refere
nce 的觀念也就容易多了)
因為對象一律是 pass by reference
所以一個對象常常
同時被多個 variable 所指到
Java 提供自動內存管理的機制
也就是俗稱的 garbage collection(垃圾收集)
當
一個對象不再被任何 variable 所指到
就代表此對象從此不可能再被利用
Java 虛擬
機器內一個負責收集垃圾的 thread 就會在適當的時機出來將此塊內存回收
記得在 Java 之父 James Gosling 應邀到台灣時(
年
月)
我曾經問他
Java
的這種自動內存管理方式造成某些程序(例如 debugger)的困擾
Java 有沒有打算支
持 weak reference
James Gosling回答
未來的版本將會支持 weak reference
果
然在後來的 JDK
就提供此支持了
JDK
除了 weak reference(也就是 java
lang
ref
WeakReference)之外
還多了一個強化的 weak reference(也就是 java
l
ang
ref
SoftReference)以及一個弱化的 weak reference(也就是 java
lang
ref
P
hantomReference)
這個設計考慮得相當仔細
這些 reference 依照「強度」排列如下
Direct Reference > Soft Reference > Weak Reference > Phantom Reference
其中
direct reference 就是一般的 reference
只要被任何 direct reference 所
reference 到的對象就不會被 garbage collector 清除
其它的三種 reference(包括
soft reference
weak reference
phantom reference)則不然
他們不會影響 gar
bage collection
如果你對這些特殊的 reference 感興趣
不妨去看看 java
lang
ref 的 Javadoc
順
便寫幾個程序試試看
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19193.html