Reference, primitive, call by XXX 必也正名乎 誌謝 : 部份文字取於前輩 TAHO 的文章
In java, there are two types… Primitive types and Reference types 這兩種 Type 限制了 variable 所能握有 (hold) 的 value 種類
Recall that… heap objRef1=0x3200 objRef3=0x3288 objRef2=0x4650 (Object instances inside) intValue=3 booleanValue=true (Reference type variables) (Primitive type variables)
What is “value”? 所謂的 value 當然就是指 " 值 " ,也就是資料 的直接內容 – 但這個 ” 值 ” 所代表的涵意,如何解釋 ? 當 x = 3 是一個數值 (ex: int x = 3) 還是一個記憶體位置 (ex: 0x3000) – 取決於我們怎麼去解釋它,這就是 primitive types 與 reference types 的主要差異
Primitive types 譯為 ” 基本型別 ” – 這種型別的 value 被稱之為 primitive value – 這種 value 所代表的就是一個數量,一個大小, 或是一種純量,並不是用來代表其他任何東西 的
Reference types 譯為 ” 參考型別 ” – 這種型別的 value 被稱為 reference value – 這個 reference value 並非是實際上應用的東西, 它不是一個數量 – 它是一個參考 (object reference) ,一個用來 ” 指 向物件 ” 的參考 根據此 ”reference value” 來找到 heap 中的物件實體 但是 reference value 並不等於是物件 !! 由於 reference value 太長,很多人簡稱 ”reference” – 造成誤解,因為 C++ 中的 reference 與 java 中的 reference 定義 並不相同 !!
Type, variable, value 當 variable hold 的是 primitive value 時,我 們稱這個 variable 是 primitive type 的變數 反之 當 variable hold 的是 reference value 時, 我們稱這個 variable 是 reference type 的變 數 – 這句話是說 它是個 " 參考型別的變數 " ,而非 " 它是個參考 "
Example int i = 1; String str = "test"; 其中 i 跟 str 是 " 變數 “ “test” 是個字串的生成表示式,會生成 String 物件 1 是個整數的直譯字 (literal) int 跟 String 是 type 我們是看不到 value 的,他們是被 hold 在變數中的 平時我們說 ”str 物件 ” ,只是簡稱,正確應說 ”str reference value 所指向的物件 ”
所謂 call by value void m1 (Person p) { p = null; } //some other place Person personObj = new Person(“John”); m1(personObj); 把 personObj 中所存的 reference value ( 一個數值 ) ,當 做參數傳給 m1 在 m1 當中,把 p 變成 null ,並不會對實體物件有動作, 只是把 p 所儲存的值清掉 – 影響的範圍,只在 m1 中而已
Discussion Java 是 call by value 還是 call by reference – 對 primitive types 而言, call by value – 對 reference types 而言, call by “reference” value 其實也是 call by value ,只是這個 value 是記憶體位置的值 – 所以, java 只有 call by value ( 官方文件也是如此說 ) – 與 C 語言同理 逼免造成混亂,最好不要誤用 reference, alias 等名詞,因為在不同的程式語言有不同涵意
In C++ Primer "A reference is an Alias" – "Because a reference is just another name for the object to which it is bound, all operations on a reference are actually operations on the underlying object to which the reference is bound." – ( 此處 object 代表東西,不是我們一般 Java 認知的物 件 ) X = NULL ,你是把 X 裡頭的值變 NULL ,還是把 X 所指向的物件變成 NULL? – 問題的關鍵在於 ” 你到底在對誰動作 ”
所以我們正名 Reference 一詞,在 java 中為 ”reference value” 之簡稱,與 C++ 中完全無關 – Alias 等同於 reference (In C++) ,所以我們也不用 既然如此,我們就不用 C++ 的 call by reference, call by value 來解釋 Java – 逼免造成混亂 我們使用 Java Language Spec (JLS) 4.1 節中的 官方定義