あるインタビューで、Java のオブジェクトが動的に作成される理由を尋ねられました。
私はこの質問を理解できません。これを説明できる機関はありますか?
その人は、Java が C++ のようにスタック上での暗黙的なオブジェクト作成を認識していないという事実に言及している可能性があります。
std::string string;
C++ でスタック上にオブジェクトを作成します。
String string;
Javaで参照を作成するだけですが、オブジェクトは作成されません(コンストラクターは呼び出されません)。
このトピックに興味がある場合は、Java のメモリ モデルについて詳しく読むことをお勧めします。
Java のオブジェクトが、静的に割り当てられたメモリでも作成されるのではなく (キーワードを使用して) 動的に割り当てられたメモリでのみ作成される理由 (たとえば、C++ のように) を尋ねるように思えます。これが質問の意味である場合(そしてそれは大きな場合です)、それに答えることができるいくつかのことがあります.new
答える前に、質問の前提が完全に正しいわけではないことに注意する必要があります (間違っているとさえ言えます)。Java オブジェクトは、厳密に動的に作成されるわけではありません。参照が特定のスコープをエスケープしないことをエスケープ分析で証明できる場合は、静的割り当てを使用するようにコンパイルできます。
上記を考えると、考えられる答えの 1 つは抽象化です。スタックとヒープ (伝統的にそれぞれ静的メモリと動的メモリに関連付けられています) は、実際には実装の詳細です (たとえ慣れているとしても)。Javaはそれを隠そうとするため、静的メモリや動的メモリなどの用語を使用して処理することはできません-メモリさえ提供せず、オブジェクトを提供します。
もう 1 つの答え (ここでも、注記を前提として) は、オブジェクトの実際の使用法です。実際のシナリオでは多くの場合、オブジェクトは最初のスコープをエスケープする必要があるため、動的割り当てが唯一の有効な候補になります。
質問を文字通りに受け取るなら、私はこう言います:
そのため、すべてを一度にロードして(初期化フェーズで)、アプリ/プログラムの最後までメモリに保持する必要はありません。これにより、より効率的なメモリ使用が可能になります。
;-)
非常に自由回答形式の質問です。適切な回答を得るには、ある程度の文脈が必要です。
これは Java に固有のものではなく、すべてのプログラミング言語全般に当てはまります。オブジェクトに割り当てられたメモリは、実行中のプラットフォームで利用可能なリソースから実行時に割り当てられるため、すべてのオブジェクトは動的であると言えます。定数、静的クラス、および同様の概念でさえ、ファイルが実際に実行されたときにのみメモリを使用します。
静的オブジェクトは、BIOS や TPL モジュールの一部など、一部のハードウェア ハードコードされた値に存在する場合があります。この値は読み取り専用です。オブジェクトの値を変更する既知の方法はありません。
ただし、これは、私が動的と考えるものに依存する単一の答えにすぎません。これは主観的なものであり、別の人が別の有効な答えを思い付く可能性があります。追加のコンテキストが与えられない限り、インタビューには適した質問ではありません。