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 に格納されます。

2番目の例では..同じことですか、コードが短いだけですか?

*編集: [] を追加するのを忘れていました。申し訳ありません。*

4

4 に答える 4

6

あなたが意味したと仮定して

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

これはうまくいきます。

2 番目のバージョンは、たまたまでNullPointerException ない限り をスローします。その場合、Java は、呼び出されるメソッドのために作成されるインスタンスに依存しません。someMethodstaticstatic

于 2013-01-11T10:59:02.123 に答える
2

それは同じではありません: 配列を作成するとき (そして、MyObject[]ではなくとして宣言する必要がありMyObjectます)、「プレースホルダー」を作成するだけで、配列内に個々の項目を作成しません。また、配列が作成されると、その要素は最初は null であるか、さまざまなプリミティブ型のゼロです。

そして、最初の例ではnew MyObject()、単独では機能しません(現在のクラスに名前のメソッドがあり、... class のインスタンスを返すMyObject()場合を除きます。混乱について話してください)。MyObject()MyObject

その結果、2 番目のコードは a をスローしますNullPointerException(@Reimeus が回答で言及している.someMethod()ように、 class の静的メソッドでない限りMyObject)。

于 2013-01-11T10:55:46.083 に答える
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();

この場合、配列を作成し、1 つの要素をインデックス 0 に置きます。

あなたの2番目のケースでは:

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

それもコンパイルされません。

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

初期化されていないため、 NullPointerException が発生しabdc[0]ます。(配列を作成しましたが、要素を入れませんでした)。

于 2013-01-11T10:59:56.037 に答える
1
abcd[0] = MyObject();

これは有効な Java 構文ではありません。C++ に似ています。あなたが必要

abcd[0] = new MyObject();

Java では、オブジェクトが変数または配列要素の直接値になることはありません。その行がないと、各配列要素は単にnullであるため、 を取得せずにメソッドを呼び出すことはできませんNullPointerException

あなたsomeMethodが静的な場合、行abcd[0].someMethod()が実際にコンパイルされるのは

MyObject.someMethod();

abcd[0]コンパイラは、式の静的な型である以外はすべて無視しますMyObject。これは、Java セマンティクスの特殊なケースです。

于 2013-01-11T10:56:58.597 に答える