java类加载机制-类定义中new如何理解
高洛峰
高洛峰 2017-04-18 10:46:41
0
5
861
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(5)
黄舟

Java プログラムを実行するとき、各クラスは 1 回だけロードされます。リロードは不可能です。したがって、質問で述べたような再帰はありません。

いいねを押す +0
洪涛

まず、JVM 仮想マシンのメモリを理解することをお勧めします

AVA オブジェクトのインスタンス化プロセス中に使用される主なオブジェクトには、仮想マシン スタック、JAVA ヒープ、およびメソッド領域が含まれます。

JAVA ファイルがコンパイルされると、まず JVM メソッド領域に追加されます。JVM メソッド領域の非常に重要な部分は、バージョン、フィールド、メソッド、インターフェイス、その他の記述情報を保存するために使用されます。コンパイル中のクラスファイルのクラスと定数および静的変数。
JAVA オブジェクトが実際にインスタンス化される場所は、JAVA ヒープと仮想マシン スタック内であり、実際のメモリでは Object A = New Object(); A は、実際には Ojbect クラスの実装に付けた名前と同じです。プログラミングでは、犬と同じように動物のカテゴリーに属しますが、特定の犬を区別するために名前を付けます。 Object は、A がこのクラスに属していることを示すために使用され、A は Object の特定の実装を参照し、New Object はこのクラスの特定の実装を作成することに相当します。したがって、オブジェクトはまず、それが属するクラスを指定できなければならず、次に、それが参照する特定の実装も指定できなければならないことが理解できます。
対応する実装方法は 2 つあります:

1. ハンドルアクセスオブジェクト


2. ダイレクトポインタアクセスオブジェクト


HotSpot は 2 番目の実装方法を採用します。 クラスのロードには、ロード、リンク、初期化の 3 つのステップが含まれます。
ロード
上の図に示すように、オブジェクトがインスタンス化されると、JVM が必要なオブジェクト タイプによってメモリ領域を分割することを理解するのは難しくありません。 JAVA ヒープを調べ、オブジェクトを識別するためのメソッド領域オブジェクト データ型へのポインタを生成します。
リンク
仮想マシンスタック内のローカル変数テーブル(ローカル変数テーブルとも言う)のポインタは、JAVAヒープ内の分割メモリ領域を指します。 JAVA 仮想マシンは動的リンクを使用します。コンパイルされたクラス ファイルのみが、最終的なメソッドの表現をメモリに保存しません。
初期化
初期化は実際にはクラスファイル内の初期化メソッドの呼び出しであり、そのコアは仮想マシンスタック内のスタックフレームのPOP/PUSHです。これは、クラス内のオブジェクトに対して同じ読み込みプロセスを実行することと同じです。
この時点で、オブジェクトの完全なインスタンス化プロセスが導入されました。

クラスの内部初期化シーケンスは静的ドメイン→非静的ドメイン→コンストラクターメソッドです

一読をお勧めします:

[JAVA Notes - Tao] オブジェクトのライフサイクルの詳細な説明

[JAVA Notes - Tao] クラス初期化の理解

いいねを押す +0
PHPzhong

クラスの読み込みとオブジェクトの初期化を混同していませんか?

いいねを押す +0
刘奇

投稿者は深く考えすぎていませんか?インスタンス化と宣言定義は 2 つの概念と段階です。
A2 には宣言時にインスタンス化される静的メンバー変数がいくつかあり、クラスのインスタンス化プロセスはコンストラクターを通じて完了します。
ここに巣があるように見えますが、そうではありません。コンパイラはインスタンス化ステートメントのコンパイル時に命令ジャンプを宣言でき、ジャンプ アドレスは二次コンパイル中に決定されます。
このように、クラス宣言フェーズ中に、a、b、c、d がインスタンス化されると、コンパイラーは A2(int i) のコンストラクター ブロックにジャンプします。
クラスのインスタンス化フェーズ中に A() コンストラクターにジャンプします。
率直に言うと、作者が考えていたようなループのネストはなく、対応する構築メソッドをさまざまな段階で呼び出すだけです。

いいねを押す +0
Peter_Zhu

クラスをロードするとき、静的変数とコンストラクターのロード順序は異なります。コンストラクター メソッドも本質的には静的メソッドです。
よくわからないので、まずは席に座ります

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!