5

私はクラスを持っているとしましょうA.java

ここに画像の説明を入力

xyzA のコンストラクター メソッドを実行すると、 Object用のメモリ空間が作成されます。

A xyz = new A();

メモリへの参照は、

[xyz] ---> '0x34524'

それがOOPの基本です。簡単です!

今、

クラスが異なる親クラスから継承している場合はどうなりますか? メモリー内に作成されるオブジェクト・スペースの数は?

私たちが持っているとしましょう、

ここに画像の説明を入力

そして、 class のオブジェクトを作成しますD.java

D omg = new D();

ここでわかっているように、D のオブジェクトは C.java のコンストラクトを呼び出し、A.java まで同様に呼び出します。これは、4 つのオブジェクトすべて (1 つは直接、もう 1 つは間接的) をインスタンス化しているため、メモリ内に 4 つの異なるメモリ参照があるということですか?

[omg] ---> '0x34525'
[C]   ---> '0x34526'
[B]   ---> '0x34527'
[A]   ---> '0x34528'

ノート :

  1. これは宿題の質問ではなく、単なる好奇心の問題です。
  2. A.java 内にインスタンス変数がある場合、オブジェクト A だけを作成するのではなく、newキーワードをヒットするたびに他の内部オブジェクトを作成するという事実を認識しています。
4

3 に答える 3

5

まず、ちょっと... オブジェクトのコンストラクターを呼び出しても、オブジェクトは割り当てられません。バイトコードでは、初期化new Object()は何かの効果として表現されます...

new java/lang/Object
invokespecial java/lang/Object <init>()V

命令は、スペースの割り当てと、まだ初期化されていないオブジェクトnewへの参照の取得を処理しますが、ハンドルはコンストラクター自体を呼び出します (これは、という名前のメソッド、つまり記述子に内部的にコンパイルされます)。invokespecialvoid<init> <init>()V

次に進むと、ヒープ上のオブジェクト割り当てと表現の内部は完全に JVM 固有です。ただし、私の知る限り、スーパークラスの数に関係なく、割り当てられたオブジェクトごとに割り当てられたオブジェクトは1つだけです。メモリ内のオブジェクト自体には、それ自身のクラスとそのスーパー クラスの両方のインスタンス フィールド用のスペースがあります。また、オブジェクトの仮想メソッド呼び出しを実行するときに仮想ディスパッチを行うために、仮想メソッド テーブル用のスペースも必要です (例: 経由)。invokevirtual

内部的には、Oracle HotSpot JVM はoopsまたは通常のオブジェクト ポインタと呼ばれるものを管理します。HotSpot メモリ レイアウトの詳細については、こちらを参照してください。HotSpot のソース リポジトリを参照してください。

于 2012-08-06T23:12:55.473 に答える
1

JVM は 1 つのオブジェクト (ここでは D) にのみメモリを割り当てます

  1. メモリの割り当てと初期化は、下部 (ここでは D) から上部 (オブジェクト) に行われます。
  2. 初期化/コンストラクターの呼び出しは、Top(Object) から Bottom(ここでは D) に発生します。

参照 :

http://www.artima.com/designtechniques/initialization.html

于 2012-08-30T11:34:28.223 に答える
0

私はこれをどこにも読んでいませんが、私の経験です。を呼び出すnew D()と、コンストラクターチェーンが開始され、最初に が作成されjava.lang.Object、次にが作成されます。つまり、(すべてのオブジェクトのルートである) を作成した後、フィールドとメソッドを含む A のメンバーのメモリを追加することにより、 A が初期化されます。 (これはコードへのポインタです!)。そしてそれをBなどに。extendsAObjectextends

拡張の過程でメソッドがオーバーライドされた場合、オブジェクト内のメソッド ポインターは新しいコードを指します。

D への参照は 1 つだけです。

于 2012-08-06T23:27:28.973 に答える