Java 名稱 參考 以及 物件
常常看到一些把 名稱 參考 以及 物件 之間搞混,
而產生困擾的狀況,所以我再來閒聊一下這方面的話題好了。
(以 reference type 的變數為例,非 primitive type 變數)
以下面這兩個敘述為例:
我想一般的書會這樣解釋," 產生一個 StringBuffer 類別的物件 sb "
" 呼叫物件 sb 的 append 方法將字串附加進物件中 ",這兩句話基本上並沒
有錯,但是卻很容易造成初學者的誤會,以為 "sb" 就是物件。
其實這是一種語言描述不精確的問題,這小小的誤會可能會造成之後學習
過程中很大的困擾。如果要精確的說,那並不能稱 sb 為物件,sb 這兩個字
母只不過是一個 name,也就是一個 "名稱" 而已,方便我們拿來稱呼某個物
件的名稱,也就是說 "sb 代表一個物件,但 sb 本身不是物件"。就像我們每
個人都有一個名字,你也可以替你家的貓,狗,甚至是電腦取一個名字。如果
你家的電腦叫做 "小花花",那這個 "小花花" 只是用來幫助我們提到你家的
電腦時用來稱呼的名詞,"小花花" 這三個字並不一台電腦,也不是你家的電
腦,它只是一個名字。
那物件在那裡呢?
在 Java 中,物件是被藏起來的,除非你手上握有關於物件的線索,否則
這個就永遠無法跟物件聯絡,而且就算你握有物件的線索,也無法 "直接" 操
控這個物件,而必須要通過這個線索去控制物件。如果有位媽媽自己生產了一
個小孩,沒有醫院的出生證明,沒有名字,沒有身份資料,那對政府來說,這
個小孩就等於是不存在。如果政府有小孩的相關資料,他可以寫信請小孩打預
防針,可以派人去家庭訪問,可以透過某種方式操控小孩,但是政府無法親身
直接作這些事( "政府自己來家庭訪問 而不是派人來家庭訪問" 這句話聽起
來就很奇怪吧)。程式設計師就是政府,他可以透過某種東西來操控物件,而
沒有辦法直接控制物件。
這種東西就稱為 "參考"。
參考就是物件的線索,我們可以透過參考來找到物件,就像透過身份證號
碼來找人一樣。如果我們失去了物件的參考,那我們就喪失了尋找物件的線索
,那這個物件對程式設計師來說就等於是不存在了,即使這物件仍在記憶體某
處,也一樣再也無法找到它。
那 "參考" 在那裡?
參考就放在名稱裡。畫成圖示的話是這樣:
框框即為 "名稱"。"參考的樣式" 以及 "物件的樣式" 稱為 "型別"。所以:
會在記憶體的某處產生一個物件,而這個物件的樣式是 StringBuffer 的格式
。同時敘述會產生一個要找到物件的線索,也就是這個物件的參考,但是這個
敘述並沒有將此參考儲存起來,而將這個參考隨意丟棄,於是這個物件生成的
同時也就失蹤了,從此再也找不到這個物件。為了避免這種狀況,我們必須先
製造一個容器放置這個參考。
這個敘述做了一個名字為 sb 的容器,其樣式為 StringBuffer 樣式,所以他
可以放置 StringBuffer 樣式的東西。於是:
就是在產生一個物件的同時,將這個物件的參考放進 sb 這個容器中。因為參
考放在 sb 中,所以以後就可以隨時利用 sb,拿到 sb 裡面的參考,藉由參
考來找到物件。我們可以將上面兩個式子合寫成:
做的事情是一樣,只是打字少打幾個字,排列方式不太一樣而已。所以當我們
看到:
時,事實上,他是利用 sb 去拿到存放在 sb 裡面的參考,再利用這個參考去
找到某一個物件,然後執行這個物件的 append() 方法。平常所稱呼的 "物件
sb" 只是一個方便用的稱呼方式,並非表示 sb 本身就是物件。搞清楚這一點
之後再看看一般初學者會感到疑問的敘述式:
為甚麼 str1 還是原來的 "First" 而不會變成 "Second" 呢?聰明的你知道
原因了嗎?因為 str2 = str1; 這一個敘述,是將 str1 裡面所放置的參考
"複製" 一份,放到 str2 裡面。這時候物件只有一個,但是有兩個參考都指
向同一個物件,這兩個參考分別放在 str1 跟 str2 中。當執行 str2 =
new String("Second"); 的時候,會將新的物件的參考放入 str2 中,把原先
舊的參考覆蓋掉,完全沒有影響到 str1 中的參考,所以變成有兩個參考分別
指向兩個不同的物件。
不知道這種說法,會不會讓初學者更了解 Java 的機制呢?還是更模糊了
? @_@|||
而產生困擾的狀況,所以我再來閒聊一下這方面的話題好了。
(以 reference type 的變數為例,非 primitive type 變數)
以下面這兩個敘述為例:
StringBuffer sb = new StringBuffer("Test");
sb.append(" names!");
我想一般的書會這樣解釋," 產生一個 StringBuffer 類別的物件 sb "
" 呼叫物件 sb 的 append 方法將字串附加進物件中 ",這兩句話基本上並沒
有錯,但是卻很容易造成初學者的誤會,以為 "sb" 就是物件。
其實這是一種語言描述不精確的問題,這小小的誤會可能會造成之後學習
過程中很大的困擾。如果要精確的說,那並不能稱 sb 為物件,sb 這兩個字
母只不過是一個 name,也就是一個 "名稱" 而已,方便我們拿來稱呼某個物
件的名稱,也就是說 "sb 代表一個物件,但 sb 本身不是物件"。就像我們每
個人都有一個名字,你也可以替你家的貓,狗,甚至是電腦取一個名字。如果
你家的電腦叫做 "小花花",那這個 "小花花" 只是用來幫助我們提到你家的
電腦時用來稱呼的名詞,"小花花" 這三個字並不一台電腦,也不是你家的電
腦,它只是一個名字。
那物件在那裡呢?
在 Java 中,物件是被藏起來的,除非你手上握有關於物件的線索,否則
這個就永遠無法跟物件聯絡,而且就算你握有物件的線索,也無法 "直接" 操
控這個物件,而必須要通過這個線索去控制物件。如果有位媽媽自己生產了一
個小孩,沒有醫院的出生證明,沒有名字,沒有身份資料,那對政府來說,這
個小孩就等於是不存在。如果政府有小孩的相關資料,他可以寫信請小孩打預
防針,可以派人去家庭訪問,可以透過某種方式操控小孩,但是政府無法親身
直接作這些事( "政府自己來家庭訪問 而不是派人來家庭訪問" 這句話聽起
來就很奇怪吧)。程式設計師就是政府,他可以透過某種東西來操控物件,而
沒有辦法直接控制物件。
這種東西就稱為 "參考"。
參考就是物件的線索,我們可以透過參考來找到物件,就像透過身份證號
碼來找人一樣。如果我們失去了物件的參考,那我們就喪失了尋找物件的線索
,那這個物件對程式設計師來說就等於是不存在了,即使這物件仍在記憶體某
處,也一樣再也無法找到它。
那 "參考" 在那裡?
參考就放在名稱裡。畫成圖示的話是這樣:
____________
| |
| |
| 參考 -----------> 某物件
| |
|__________|
框框即為 "名稱"。"參考的樣式" 以及 "物件的樣式" 稱為 "型別"。所以:
new StringBuffer("Test");
會在記憶體的某處產生一個物件,而這個物件的樣式是 StringBuffer 的格式
。同時敘述會產生一個要找到物件的線索,也就是這個物件的參考,但是這個
敘述並沒有將此參考儲存起來,而將這個參考隨意丟棄,於是這個物件生成的
同時也就失蹤了,從此再也找不到這個物件。為了避免這種狀況,我們必須先
製造一個容器放置這個參考。
StringBuffer sb;
這個敘述做了一個名字為 sb 的容器,其樣式為 StringBuffer 樣式,所以他
可以放置 StringBuffer 樣式的東西。於是:
sb = new StringBuffer("Test");
就是在產生一個物件的同時,將這個物件的參考放進 sb 這個容器中。因為參
考放在 sb 中,所以以後就可以隨時利用 sb,拿到 sb 裡面的參考,藉由參
考來找到物件。我們可以將上面兩個式子合寫成:
StringBuffer sb = new StringBuffer("Test");
做的事情是一樣,只是打字少打幾個字,排列方式不太一樣而已。所以當我們
看到:
sb.append(" names!");
時,事實上,他是利用 sb 去拿到存放在 sb 裡面的參考,再利用這個參考去
找到某一個物件,然後執行這個物件的 append() 方法。平常所稱呼的 "物件
sb" 只是一個方便用的稱呼方式,並非表示 sb 本身就是物件。搞清楚這一點
之後再看看一般初學者會感到疑問的敘述式:
String str1;
String str2;
str1 = new String("First");
str2 = str1;
str2 = new String("Second");
為甚麼 str1 還是原來的 "First" 而不會變成 "Second" 呢?聰明的你知道
原因了嗎?因為 str2 = str1; 這一個敘述,是將 str1 裡面所放置的參考
"複製" 一份,放到 str2 裡面。這時候物件只有一個,但是有兩個參考都指
向同一個物件,這兩個參考分別放在 str1 跟 str2 中。當執行 str2 =
new String("Second"); 的時候,會將新的物件的參考放入 str2 中,把原先
舊的參考覆蓋掉,完全沒有影響到 str1 中的參考,所以變成有兩個參考分別
指向兩個不同的物件。
不知道這種說法,會不會讓初學者更了解 Java 的機制呢?還是更模糊了
? @_@|||

0 Comments:
張貼留言
<< Home