PHP中文网2017-04-18 10:48:41
まず、JVM 仮想マシンのメモリを理解することをお勧めします
AVA オブジェクトのインスタンス化プロセス中に使用される主なオブジェクトには、仮想マシン スタック、JAVA ヒープ、およびメソッド領域が含まれます。 JAVA ファイルがコンパイルされると、まず JVM メソッド領域に追加されます。JVM メソッド領域の非常に重要な部分は、バージョン、フィールド、メソッド、インターフェイス、その他の記述情報を保存するために使用されます。コンパイル中のクラスファイルのクラスと定数および静的変数。
JAVA オブジェクトが実際にインスタンス化される場所は、JAVA ヒープと仮想マシン スタック内であり、実際のメモリでは Object A = New Object(); A は、実際には Ojbect クラスの実装に付けた名前と同じです。プログラミングでは、犬と同じように動物のカテゴリーに属しますが、特定の犬を区別するために名前を付けます。 Object は、A がこのクラスに属していることを示すために使用され、A は Object の特定の実装を参照し、New Object はこのクラスの特定の実装を作成することに相当します。したがって、オブジェクトはまず、それが属するクラスを指定できなければならず、次に、それが参照する特定の実装も指定できなければならないことが理解できます。
対応する実装方法は 2 つあります:
2. ダイレクトポインタアクセスオブジェクト
HotSpot は 2 番目の実装方法を採用します。 クラスのロードには、ロード、リンク、初期化の 3 つのステップが含まれます。
ロード
上の図に示すように、オブジェクトがインスタンス化されると、JVM が必要なオブジェクト タイプによってメモリ領域を分割することを理解するのは難しくありません。 JAVA ヒープを調べ、オブジェクトを識別するためのメソッド領域オブジェクト データ型へのポインタを生成します。
リンク
仮想マシンスタック内のローカル変数テーブル(ローカル変数テーブルとも言う)のポインタは、JAVAヒープ内の分割メモリ領域を指します。 JAVA 仮想マシンは動的リンクを使用します。コンパイルされたクラス ファイルのみが、最終的なメソッドの表現をメモリに保存しません。
初期化
初期化は実際にはクラスファイル内の初期化メソッドの呼び出しであり、そのコアは仮想マシンスタック内のスタックフレームのPOP/PUSHです。これは、クラス内のオブジェクトに対して同じ読み込みプロセスを実行することと同じです。
この時点で、オブジェクトの完全なインスタンス化プロセスが導入されました。
クラスの内部初期化シーケンスは静的ドメイン→非静的ドメイン→コンストラクターメソッドです
一読をお勧めします:
[JAVA Notes - Tao] オブジェクトのライフサイクルの詳細な説明 [JAVA Notes - Tao] クラス初期化の理解
怪我咯2017-04-18 10:48:41
投稿者は深く考えすぎていませんか?インスタンス化と宣言定義は 2 つの概念と段階です。
A2 には宣言時にインスタンス化される静的メンバー変数がいくつかあり、クラスのインスタンス化プロセスはコンストラクターを通じて完了します。
ここに巣があるように見えますが、そうではありません。コンパイラはインスタンス化ステートメントのコンパイル時に命令ジャンプを宣言でき、ジャンプ アドレスは二次コンパイル中に決定されます。
このように、クラス宣言フェーズ中に、a、b、c、d がインスタンス化されると、コンパイラーは A2(int i) のコンストラクター ブロックにジャンプします。
クラスのインスタンス化フェーズ中に A() コンストラクターにジャンプします。
率直に言うと、作者が考えていたようなループのネストはなく、対応する構築メソッドをさまざまな段階で呼び出すだけです。
天蓬老师2017-04-18 10:48:41
クラスをロードするとき、静的変数とコンストラクターのロード順序は異なります。コンストラクター メソッドも本質的には静的メソッドです。
よくわからないので、まずは席に座ります