Java對象不具備與主類型一樣的存在時間。用new關鍵字創建一個Java對象的時候,它會超出作用域的范圍之外。所以假若使用下面這段代碼:
{
String s = new String("a string");
} /* 作用域的終點 */
那麼句柄s會在作用域的終點處消失。然而,s指向的String對象依然占據著內存空間。在上面這段代碼裡,我們沒有辦法訪問對象,因為指向它的唯一一個句柄已超出了作用域的邊界。在後面的章節裡,大家還會繼續學習如何在程序運行期間傳遞和復制對象句柄。
這樣造成的結果便是:對於用new創建的對象,只要我們願意,它們就會一直保留下去。這個編程問題在C和C++裡特別突出。看來在C++裡遇到的麻煩最大:由於不能從語言獲得任何幫助,所以在需要對象的時候,根本無法確定它們是否可用。而且更麻煩的是,在C++裡,一旦工作完成,必須保證將對象清除。
這樣便帶來了一個有趣的問題。假如Java讓對象依然故我,怎樣才能防止它們大量充斥內存,並最終造成程序的“凝固”呢。在C++裡,這個問題最令程序員頭痛。但Java以後,情況卻發生了改觀。Java有一個特別的“垃圾收集器”,它會查找用new創建的所有對象,並辨別其中哪些不再被引用。隨後,它會自動釋放由那些閒置對象占據的內存,以便能由新對象使用。這意味著我們根本不必操心內存的回收問題。只需簡單地創建對象,一旦不再需要它們,它們就會自動離去。這樣做可防止在C++裡很常見的一個編程問題:由於程序員忘記釋放內存造成的“內存溢出”。