2011-11-29 70 views

回答

5

Phone p;只聲明瞭一個參考處理程序p它沒有指向任何地方(它是一個未初始化的,只有在你指定了某些東西之後才能使用[謝謝@Anthony])。

Phone p = new Phone(200);聲明瞭一個基準處理器p指向新創建Phone對象(Phone(200)初始化)。

new Phone(200)創建一個新的Phone對象,但由於沒有引用它的地方存儲在任何地方,它立即有資格進行垃圾回收(除非它的構造函數在某處存儲引用)。

(請注意,在Java中,所有的「變量」,其類型爲引用類型是真正參考的處理程序。值類型的變量只有直接包含的值。由於Phone是引用類型(這是一個classPhone p總是爲「參照Phone」。)

+0

第三位:假設在構造函數中沒有「泄漏這個」:) –

+0

@KublaiKhan:是的,我說過。構造函數可以調用一些Mighty Singleton來存儲引用,例如:-)。 –

5

第一個片段只聲明變量p與給定類型Phone。你還沒有創建任何對象,只有一個變量。

第三個實例化新的Phone對象(未分配給變量)。

第二個將兩個聲明和實例組合成一行代碼。

Phone p; // declaration of variable 
p = new Phone(200); // instantiation of object, assigned to variable 

Phone p = new Phone(200); // declaration and instantiation in a single line 

對於要使用的p,您需要實例化它(或以其他方式初始化它)。聲明本身沒有用處。在本地(在方法範圍內聲明的變量),在不首先初始化的情況下使用它是非法的。如果它是一個類級別的成員,那麼當您嘗試訪問其任何成員函數時,它將僅僅是一個空指針。

+0

Java中的每個*變量都不會被初始化嗎?第一個'p'應該有一個明確的值。 –

+1

@KerrekSB,類成員初始化爲默認值(對於引用爲null),但本地化程序不會初始化(就編譯器而言)並且必須在第一次訪問之前進行初始化。 –

+0

有趣。那麼'p'處於一個不確定的狀態? –

1

Phone p是尚未被初始化一個電話對象的引用。

Phone p = new Phone(200)是對構造函數Phone(int var)初始化的Phone對象的引用。

new Phone(200)使用構造函數Phone(int var)創建一個新的Phone對象。

1
Phone p; 

只是一個引用或「指針」,因爲有些喜歡C語言的人會稱它爲「指針」。它包含對象的路徑,但當前路徑爲空。

Phone p = new Phone(200) //(200 is the price of the phone). 

在這裏,你創建了一個新的電話對象,通過調用其構造函數取200值。該對象然後被分配給參考p。

new Phone(200) 

這裏你只是創造型電話的對象,但沒有提到它,所以這個對象又由JVM進行垃圾回收(如果沒有什麼別的引用內部)。

問候!

相關問題