私の先生は私に質問をしました:
「Javaでオブジェクトを作成するとどうなるか」.
私の知る限り、メモリ割り当て、変数の初期化、およびコンストラクター メソッドの呼び出しは、オブジェクトの作成時に行われます。
しかし、私の先生は私がほぼ正しいと言った。メモリヒープを除いて、後の2つは正しいです。代わりに、メモリ割り当てが発生すると彼は言いました。そのオブジェクトはヒープに格納されていると思うので、先生は間違っています。あなたはそう思いますか?
いつものように、この種の質問に対する解決策を見つけるのに最適な場所は、Java 言語仕様です。
具体的には、新しいインスタンスの作成に関するセクションから、例外が発生しない限り、これが新しいオブジェクトが作成されるときのシーケンスであることが理解できます。
Object
。最初の行とは、 or への明示的な呼び出し、super()
またはthis()
への暗黙super()
的な呼び出しを意味します。さて、教師が実際のオペレーティング システム コールとしてメモリ割り当てについて話している可能性があります。その場合、JVM が独自のヒープを管理するため、Java メモリ割り当てが必ずしも OS メモリに変換されるとは限らないという意味で彼は正しいです。割り当て呼び出し (可能性はありますが)。
簡単な例を使って答えます。
クラスがあるとしますCar
。今、あなたは書きます:
Car car;
car = new Car();
最初のステートメントは、スタック内に参照を作成します。car
2 番目のステートメントでは、Car
クラスがメイン メモリに読み込まれCar
、ヒープ内のメンバーにメモリが割り当てられます。これが発生すると、メンバーは JVM によって提供された値で初期化されます。
While the JVM is running the program, whenever a new object is created, the JVM reserves as portion of the Heap for that object (where the object will be stored). The amount of Heap that gets reserved is based on the size of the object.
The JVM maps out this segment in the Heap to represent all of the attributes of the object being stored. A reference (address in Heap) to the object is kept by the JVM and stored in a table that allows the JVM to keep track of all the objects that have been allocated on the Heap. The JVM uses these references to access the objects later (when the program accesses the object).
他の人が言ったことに加えて、これがオブジェクトの最初の使用である場合、そのクラスを初期化する必要があります-JLSで説明されているように(新しいインスタンスの作成に関するセクションの前のセクション!)。
これには基本的に、クラスに関する必要な情報をメモリにロードすることが含まれます。つまりKlass
、静的変数とメソッド テーブルを有効にするためのオブジェクトを作成します。これには、スーパークラスとインターフェースのロードも含まれる場合があります。これはすべて によって実行されますClassLoader
。