どのような時に新しいオブジェクトのJavaの発生を(ターン)

クラスは、最初のオブジェクトが属する参照する新しいJavaオブジェクトがメモリにロードされていないではない場合、それは最初のクラスの完全修飾名(パッケージ名+クラス名)を介してロードされます。クラス終了後ロードおよび初期化した後、作業オブジェクトを作成しています。

:私たちの最初の仮定は、新しいオブジェクトは、2つの工程に分けることができ、その場合、このタイプの最初の使用、ということである負荷と初期化クラスは、オブジェクトを作成します

まず、クラスローディング手順(最初のクラスを使用して)

Javaの使用して、親委任モデルをそのクラスのロード処理を説明する前に、私たちはその作業フルーツのオレンジを見て、クラスをロードします:

親委任モデルの作業プロセス:クラスローダ(クラスローダが)要求クラスがロードされて受け取った場合、それは最初にこのクラスをロードしようとするが、各レベルを完了するために、親クラスローダに要求を委託する所有していませんすべてのリクエスト究極の負荷は、彼らがその検索で要求を(完了できないフィードバックをロードするための親クラスローダがロードする必要性を見つけることができませんでしたときにのみ、ブートクラスローダのトップに転送する必要がありますので、クラスローダは、真でありますクラス)、サブローダは、独自のをロードしようとするとき。

委任両親のメカニズムを使用する利点:同じクラス名は、より限定された貯留シーケンスを表示されたときにロードを実行するときに能力を効果的にクラスのグローバル一意性を確保するためには、クラスローダは、常にこれらのクラスの一つだけをロードします。

1、ロード

クラスローダは、バイナリバイトの読み出しを担当するクラスの完全修飾名に応じてJVMの内部に流入し、ゾーンにランタイムメモリ領域の方法を記憶し、次にターゲットのJavaの対応するタイプに変換されます。 lang.Classオブジェクトインスタンス

2、検証

検証をフォーマット:クラスファイルの仕様かどうかを確認してください

セマンティック検証:最終的なサブクラスが含まれているようなタイプがマークされている検査、最終メソッドをチェッククラスのサブクラスで上書きするかどうか、親と子クラス間の互換性を確保するには、Noステートメント方法(例えば、同じメソッドのシグネチャとしてしかし、戻り値とは異なります)

ベリファイ:動作において、定数プール内の様々なシンボルの正しい動作に必要なスタックデータを通常分析フェーズで行わ(検証を実行し、シンボルが指定されたタイプの完全修飾名で参照することができるかどうかのチェックがターゲットへの参照に記載されていますクラスメンバーに、ならびにアクセス等の情報へのアクセスの変更を許可するかどうか)

3、準備ができて

クラスメモリ空間の静的変数に割り当てられているすべて、および(オブジェクトがインスタンス変数は、この操作の範囲内ではありませんていないので)初期値を設定します

修飾された最終的な静的変数(定数)は、割り当てを指示します。

4、構文解析

直接参照に符号定数プールを(直接メソッドを呼び出すために、クラスまたはフィールド、あるいはメモリ内のオフセットメソッドポインタを取得し)、これは、初期化後に行ってもよいです。

静的にバインドされるコンテンツのニーズを解析します。//すべての方法が書き換えられないだろうと静的結合ドメインになります

2,3,4またはそれ以上のステージとひとまとめに3つのリンクステージは、リンクステージは、JVMの動作状態に組み込まれるバイナリデータのバイトストリームのクラスにJVMにロードされる行います。

図5に示すように、初期化(父後サブ)

静的変数の代入

静的ブロックの実行

注:コードの静的ブロックはJVMを呼び出すことができます

  複数のスレッドが同時にクラスを初期化する必要がある場合は、1つのスレッドのみだけ待機している他のスレッドを通知します、スレッドが唯一のアクティブなスレッドは、クラスの初期化を実行した後、残りを待つ必要があり、それらが初期化を実行できるようにすることができます。

そのため、親サブクラスへの依存のため、クラスのロードは、サブクラスロード順は、あまりにも、親クラスが初期化されているロード。ただし、親クラスが初期化され、サブクラスの静的変数の値は、いくつかの例外で、デフォルトです。

最後に、メソッド領域は、現在のクラスのクラス情報を含むクラス静的変数、クラス初期化コード(静的変数の定義代入文、インスタンス変数が定義された静的な初期化コードブロック)がインスタンス初期化コード(割り当てステートメント場合インスタンス変数の定義コードブロックの例工法)及び方法の例、ならびにクラス情報は、親クラスを参照します。

第二には、オブジェクトを作成します

図1に示すように、オブジェクトは、ヒープ内のメモリを割り当てる必要があります

メモリの割り当ては、このクラスと親クラスのすべてのインスタンス変数を含むが、任意の静的変数が含まれていません。

すべてのインスタンス変数のための2、割り当てのデフォルト値

この方法は、ヒープのインスタンス変数のコピー内に定義され、デフォルト値を割り当てます

図3に示すように、インスタンスの初期化コードが実行されます

初期化シーケンスは、最初の初期化は、ブロック工法の一例を実行する、親クラスの初期化初期化サブクラスであります

図4に示すように、同様の子供C =タイプ子参照変数CのC-引用定義の形で新しい子()、およびアドレスの割り当てがある場合れるスタック領域内のオブジェクトのヒープ領域

ことを注意各サブクラスのオブジェクトは親オブジェクトへの参照を保持している、あなたはスーパーキーワードに内部親クラスのオブジェクトを呼び出すが、外部からアクセス可能ではないことができます

第三に、サプリメント

情報の実際の型は、検索中のオブジェクトのメソッドを起動したときに、親の型情報を探しに行くために言葉を見つけることができない、参考例でインスタンスメソッドを呼び出します。

継承階層が深い場合は、親クラスを呼び出すメソッドが上位比較に位置しており、すべての呼び出しは見つけることが何度も通過するので、コールの効率は、比較的低いです。システムが使用され、この時間は、主と呼ばれる仮想メソッドテーブルコールの効率を最適化する方法を

、いわゆる仮想メソッドテーブル、クラスがロードされるとき、ある、各テーブル用のクラスを作成するには、この表には、親クラスを含め、そのクラスのダイナミックな結合方法とそのアドレスのすべてのオブジェクトが含まれていますが、この方法は、1つのレコードのみですサブクラスがオーバーライドした後、親クラスのメソッドは、サブクラスのみが保存されます。場合は、動的バインディング法によるオブジェクト、ちょうどそれぞれの親のための一つ一つを発見する必要がなく、それにルックアップテーブル。

 


 オリジナル住所:https://www.cnblogs.com/JackPn/p/9386182.html

 

おすすめ

転載: www.cnblogs.com/xhy-shine/p/11897170.html