2013-01-11 46 views
0

我想知道是否在這兩種情況下創建MyObject對象。如果不是,爲什麼兩種情況都能正常工作?這個語法有什麼不同嗎?

MyObject[] abcd = new MyObject[8]; 
abcd[0] = MyObject(); 
String str = abcd[0].someMethod(); 

MyObject[] abcd = new MyObject[8]; 
String str = abcd[0].someMethod(); 

我知道,在第一示例中,一個爲MyObject陣列與8個元素創建並存儲在該數組稱爲ABCD的參考變量。我有一個MyObject引用的數組,但沒有真正的MyObject對象。所以我創建了這些對象,第一個對象存儲在數組0中。

在第二個示例中,它是相同的東西,只是較短的代碼?

* 編輯:忘了補充[]我很抱歉。 *

+3

'abcd [0] = MyObject();'?它是否編譯? – gefei

+0

我認爲它應該是'new MyObject()'。 – Polynomial

+0

你確定第一個代碼甚至編譯?第二部分將編譯,但會拋出一個NPE。 – ppeterka

回答

6

假設你的意思是

MyObject[] abcd = new MyObject[8]; 
abcd[0] = new MyObject(); 
String str = abcd[0].someMethod(); 

這將正常工作。

第二個版本會拋出一個NullPointerException除非someMethod恰好是static。在這種情況下,Java不會依賴要爲要調用的static方法創建實例。

+0

+1爲'靜態',我總是忘記這一個... – fge

+0

是的,這就是我的意思,對此感到遺憾。並感謝你解釋這一點。 是的。的someMethod();對我來說實際上是靜止的。 它爲什麼只適用於靜態方法? –

+1

@ElmedinZelenkic,因爲靜態方法不需要一個實例來「運行」,他們只需要類,它是「永遠」在那裏。 JVM知道該數組的類型爲「MyObject」,因此該代碼相當於編寫「MyObject.someMethod()」。 – fge

2

這是不一樣的東西:當你創建一個數組(它應該被宣佈爲MyObject[],而不是一個MyObject),您只需創建一個「佔位符」,你不創建陣列中的各個項目。當一個數組被創建時,它的元素首先是空的,或者對於不同的基元類型是零。

而在你的第一個例子,你應該做的new MyObject(),獨自MyObject()將無法​​正常工作(除非有一個方法由名字MyObject()在當前類...返回MyObject類的一個實例。談論混亂)。

其結果是,你的第二個代碼會拋出一個NullPointerException(除非像@Reimeus在他的回答中提到,.someMethod()MyObject類的靜態方法)。

1
abcd[0] = MyObject(); 

這是無效的Java語法;看起來更像C++。您需要

abcd[0] = new MyObject(); 

在Java對象從來都不是一個變量或數組元素的直接價值。如果沒有這一行,每個數組元素只是null,所以如果沒有獲取NullPointerException,您將無法調用任何方法。

如果您someMethod是靜態的,是什麼線abcd[0].someMethod()實際上編譯逼到

MyObject.someMethod(); 

編譯器會忽略一切,但靜態類型的表達式abcd[0],這是MyObject的。這是Java語義的特例。

1
MyObject abcd = new MyObject[8]; 
abcd[0] = MyObject(); 
String str = abcd[0].someMethod(); 

這個片段不編譯它應該像

MyObject [] abcd = new MyObject[8]; 
abcd[0] = new MyObject(); 
String str = abcd[0].someMethod(); 

在這種情況下,你所創建的陣列,並把一個元素的索引0

在你的第二個案例:

MyObject abcd = new MyObject[8]; 
String str = abcd[0].someMethod(); 

它也不能編譯,應該是

MyObject []abcd = new MyObject[8]; 
String str = abcd[0].someMethod(); 

因爲abdc[0]未初始化,所以您將有NullPointerException。 (你創建了數組,但沒有放入任何元素)。

+0

謝謝你解決這個問題。這正是我的意思。 但進一步..爲什麼第二個例子只能使用靜態方法? –