2015-09-20 11 views
7

私の背景はC++であり、C++では簡単な構文を使ってオブジェクトの配列を簡単に作成できます。 className obj[n];また、コンストラクタはn時間を呼び出します。Javaのオブジェクトの配列対C++

しかし、私はオブジェクトの配列をJavaのclassName[] obj=new className[n];コンストラクタ呼び出しで作成しようとしました。検索後、私はstackoverflowにこの質問の答えを見つけました。nオブジェクトを指すことができ、それはnオブジェクトを指すことができ、それぞれの参照のために再びオブジェクトを作成する必要があります。 obj[0]=new className();

今、私はなぜjavaがこれを行うのか尋ねたいですか? C++でも許されている理由はありますか?同じ方法でオブジェクトの配列を作成することはできませんか? これを検索しましたが、まだ正確な答えが得られませんでした。

答えて

9

C++では、オブジェクトを作成するメモリを柔軟に選択できます。自動領域(スタック上)、静的領域、または動的領域にオブジェクトを作成できます。最後のケースでは、オブジェクトポインタを取得し、完了後にオブジェクトポインタを解放する責任を負います。

対照的に、すべてのオブジェクトが参照オブジェクトであるため、すべてのJava hasは動的領域オプションです。 C++では、ポインタを介してオブジェクトを使用するのと同等で、常にnewでオブジェクトを作成することと同等です。 C++でオブジェクト配列の作成を許可

myclass *array[10]; 
for (int i = 0 ; i != 10 ; i++) { 
    array[i] = new myclass(); 
} 
... 
for (int i = 0 ; i != 10 ; i++) { 
    delete array[i]; 
} 

は、プログラマが内のオブジェクトの配列を割り当てさせて必要性によって決まるの選択でした:あなたはC++でこれを行うと、あなたはまたnew -edオブジェクトとポインタのあなたの配列を埋めるために持っています自動領域。それは、あなたが配列を作るオブジェクトにはデフォルトのコンストラクタがなければならないので、トレードオフが伴います。これは理想的ではありません。なぜなら、デフォルトコンストラクタの要件は任意であるからです。

Javaは、自動メモリ要件から解放されていたので、オブジェクトを個別に初期化する必要がある単純な解決策になりました。

2

許可されるかどうかは、言語設計者によって決まります。

あなたが使用できるJavaで同じオブジェクトを参照して、配列のすべての要素を初期化したい場合:

className[] obj = new clasName[2]; 
Arrays.fill(obj, new className()); 

または異なるオブジェクトを作成し、各コンストラクタ

に異なる引数を渡しますclassName[] obj = new className[] {new className(), new className()};

+0

我々は異なる言語を選択する理由は、次に理由があります。?それぞれの言語は性能、セキュリティなどの点で違いがあり、すべての言語のデザイナーが理由のために構文/ロジックを選択していることをご存知でしょうか?英語-_- –

+1

'Arrays.fill'ソリューションは1つのオブジェクトを作成し、このような結果はめったにありません。通常、配列要素ごとに異なるオブジェクトが必要です。 –

+0

@TagirValeevに感謝します。 swer。 –

3

デフォルトのコンストラクタで配列と同じ型のオブジェクトを作成する必要はあまりありません。場合によっては、カスタムコンストラクタを呼び出すこともできます。サブクラスをインスタンス化して配列に格納することがあります。それは、オブジェクトへの参照の配列ではなく、オブジェクトの配列そのものだからJava配列className[] objは、C++の配列className* obj[n]だけではなく、className obj[n]により等価であることを

は注意してください。 Java-8では、オブジェクトそのものを作成することはできません(project Valhallaの一部として説明されていますが、Java-9では表示されません)。オブジェクト自体がC++の配列に格納されている場合、配列を初期化する必要があります。ヌルはオブジェクトではないので、 "ヌル"などをそこに保持することはできません。これはリファレンス(またはポインタ)です。配列className* obj[n]をC++で作成すると(Java className[] obj配列に似ています)、初期化もされていません。Javaでは

className[] array = Stream.generate(className::new).limit(n).toArray(className[]::new); 
+0

@Tiger無論-Argu-constructorといつかargu-constructorが必要な場合は、なぜリファレンスを作成するのでしょうか? className obj = new className(5); 'まあまあ' className obj2 = new className( "A"); '私が期待しているのは、コードの可読性とコード化のためだけである。それ以外の理由はありますか? (英語が苦手な人には申し訳ありません) –

+0

@Tagirもちろん、あなたのせいではありませんが、Java-8ソリューションを「簡単に」呼び出すまでは行っていません。 –

+0

@LetDoit、ごめんなさい。それを言い換えてみてください。コメントエリアでは十分でない場合は、必要な例をすべて追加して新しい質問を投稿することを検討してください。 –

1

、あなたは変数を宣言する時はいつでも、それはオブジェクトのメンバーである:

は最後のJava-8にあなたは非常に簡単に、このようなデフォルトコンストラクタでそれらをインスタンス化するすべてのオブジェクトを作成できることに注意してください(bytechar、...)または参照型(ある種のオブジェクトへのポインタ)のいずれかです。
したがって、オブジェクトの配列はありません。参照の配列のみです。 Cでは

++あなたはあなたがどのように多くの間接選択し、自由に、割り当てる方法、オブジェクトを構築し、破壊し、多くの複雑さを追加する自由と責任があります。

  • 間接参照演算子(*pointer
  • を間接参照アンドユース部材(pointer->member
  • アドレスのオペレータ(&object
  • 他のタイプ(type* var)からポインタ・ツー・タイプを導出する方法。
  • 配置 - 新( `新しい(ポインタ)(ARG1、ARG2)を入力し、
  • 明示的に削除・オペレーター(delete pointer
  • はるか
関連する問題