84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
Java プログラムを実行するとき、各クラスは 1 回だけロードされます。リロードは不可能です。したがって、質問で述べたような再帰はありません。
まず、JVM 仮想マシンのメモリを理解することをお勧めします
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] クラス初期化の理解
クラスの読み込みとオブジェクトの初期化を混同していませんか?
投稿者は深く考えすぎていませんか?インスタンス化と宣言定義は 2 つの概念と段階です。 A2 には宣言時にインスタンス化される静的メンバー変数がいくつかあり、クラスのインスタンス化プロセスはコンストラクターを通じて完了します。 ここに巣があるように見えますが、そうではありません。コンパイラはインスタンス化ステートメントのコンパイル時に命令ジャンプを宣言でき、ジャンプ アドレスは二次コンパイル中に決定されます。 このように、クラス宣言フェーズ中に、a、b、c、d がインスタンス化されると、コンパイラーは A2(int i) のコンストラクター ブロックにジャンプします。 クラスのインスタンス化フェーズ中に A() コンストラクターにジャンプします。 率直に言うと、作者が考えていたようなループのネストはなく、対応する構築メソッドをさまざまな段階で呼び出すだけです。
クラスをロードするとき、静的変数とコンストラクターのロード順序は異なります。コンストラクター メソッドも本質的には静的メソッドです。 よくわからないので、まずは席に座ります
Java プログラムを実行するとき、各クラスは 1 回だけロードされます。リロードは不可能です。したがって、質問で述べたような再帰はありません。
まず、JVM 仮想マシンのメモリを理解することをお勧めします
AVA オブジェクトのインスタンス化プロセス中に使用される主なオブジェクトには、仮想マシン スタック、JAVA ヒープ、およびメソッド領域が含まれます。JAVA ファイルがコンパイルされると、まず JVM メソッド領域に追加されます。JVM メソッド領域の非常に重要な部分は、バージョン、フィールド、メソッド、インターフェイス、その他の記述情報を保存するために使用されます。コンパイル中のクラスファイルのクラスと定数および静的変数。
1. ハンドルアクセスオブジェクト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] クラス初期化の理解
クラスの読み込みとオブジェクトの初期化を混同していませんか?
投稿者は深く考えすぎていませんか?インスタンス化と宣言定義は 2 つの概念と段階です。
A2 には宣言時にインスタンス化される静的メンバー変数がいくつかあり、クラスのインスタンス化プロセスはコンストラクターを通じて完了します。
ここに巣があるように見えますが、そうではありません。コンパイラはインスタンス化ステートメントのコンパイル時に命令ジャンプを宣言でき、ジャンプ アドレスは二次コンパイル中に決定されます。
このように、クラス宣言フェーズ中に、a、b、c、d がインスタンス化されると、コンパイラーは A2(int i) のコンストラクター ブロックにジャンプします。
クラスのインスタンス化フェーズ中に A() コンストラクターにジャンプします。
率直に言うと、作者が考えていたようなループのネストはなく、対応する構築メソッドをさまざまな段階で呼び出すだけです。
クラスをロードするとき、静的変数とコンストラクターのロード順序は異なります。コンストラクター メソッドも本質的には静的メソッドです。
よくわからないので、まずは席に座ります