出典: 何が起こるかの過程におけるJavaの新しい新しいオブジェクト
クラスが最初に表示されますとき、それは最初のクラスの完全修飾名を経由してロードされますされていない場合、新しいJavaオブジェクトではオブジェクト所属は、メモリにロードされていません。クラス終了後ロードおよび初期化した後、作業オブジェクトを作成しています。
:私たちの最初の仮定は、新しいオブジェクトは、2つの工程に分けることができ、その場合、このタイプの最初の使用、ということである負荷と初期化クラスとオブジェクトを作成します。
まず、クラスローディング手順(最初のクラスを使用して)
Javaは使用することです、親委任モデルを、我々はその作業工程を見て、ロード処理を説明する前に、クラスをロードするために、そのクラス:
両親は、委託業務プロセスモデルは次のとおりです。クラスローダ(クラスローダー)は、要求クラスがロードされている受信あれば、それは最初にこのクラスをロードしようとするが、それぞれのを完了するために、親クラスローダに要求を委託する所有していませんすべてのリクエスト究極の負荷は、彼らが要求を完了することはできませんフィードバックをロードする場合にのみ、親クラスローダ、ブートクラスローダのトップに転送する必要がありますので、レベルのクラスローダは(その検索に必要なものが見つかりませんでした、真であります)クラスをロードする際、サブローダは、独自のをロードしようとします。
効果的に、常にこれらのクラスの一つだけをロードする、ロードを実行するときに同じクラス名は、より限定されたプログラム、クラスローダを表示されたとき、クラスのグローバル一意性を保証する能力:両親を使用する利点は、メカニズムを委託します。
1、ロード
クラスローダは、バイナリバイトの読み出しを担当するクラスの完全修飾名に応じてJVMの内部に流入し、ゾーンにランタイムメモリ領域の方法を記憶し、次にターゲットのJavaの対応するタイプに変換されます。 lang.Classオブジェクトインスタンス
2、検証
フォーマットの検証:ファイル仕様クラスかどうかを確認し
、セマンティック検証:最終サブクラスが含まれているようなタイプがマークされているチェック、最終メソッドのチェックをクラスのサブクラスは上書きするかどうか; makeが必ず親と子のクラスの間には互換性がありませんいくつかのメソッド宣言(例えば、同じメソッドシグネチャ、メソッドの戻りが、異なる値として)
動作検証:データオペランドスタックは定数プール内の基準シンボルの検証を実行し、正しい操作でなければならない(典型的に解析フェーズを実行)シンボルが指定されたタイプの完全修飾名の位置を参照することによって説明することができるかどうかを確認し、アクセス修飾子クラスは、会員情報等へのアクセスを可能にします
3、準備ができて
すべてのクラスのメモリ空間の静的変数に割り当てられ、(オブジェクトが持っているので何のインスタンス変数は、この動作の範囲外ではない)の初期値を設定するために
、直接割り当てを静的最終変数(定数)を変更します。
4、構文解析
直接参照に符号定数プールを(直接メソッドを呼び出すために、クラスまたはフィールド、あるいはメモリ内のオフセットメソッドポインタを取得し)、これは、初期化後に行ってもよいです。
静的にバインドされるコンテンツのニーズを解析します。//すべての方法が書き換えられないだろうと静的結合ドメインになります
2,3,4またはそれ以上のステージとひとまとめに3つのリンクステージは、リンクステージは、JVMの動作状態に組み込まれるバイナリデータのバイトストリームのクラスにJVMにロードされる行います。
図5に示すように、初期化(父後サブ)
4.1静的変数への代入
静的コードブロック4.2を実行します
注:コードの静的なブロックのみJVM起動することができ
、複数のスレッドが同時にクラスを初期化する必要がある場合は、一つのスレッドだけが唯一の彼らは初期化を実行できるようにすることができ、スレッドは、唯一の後にクラスの初期化を実行するアクティブなスレッドで、残りのを待たなければなりません私たちは待っている他のスレッドに通知します。
そのため、親サブクラスへの依存のため、クラスの親クラスをロードするロード順序は、あまりにも、ロード、初期化のサブクラスです。親クラスの初期化、静的変数のサブクラスの値はまた、いくつかを持っている場合しかし、それはデフォルトです。
最後に、メソッド領域は、現在のクラスのクラス情報を含むクラス静的変数、クラス初期化コード(代入文静的変数の定義 と 静的初期化コードブロックは)、インスタンス変数が定義され、インスタンスの初期化コード(代入文インスタンス変数の定義コードブロックの例と工法)及び方法の例、ならびにクラス情報は、親クラスを参照します。
第二には、オブジェクトを作成します
図1に示すように、オブジェクトは、ヒープ内のメモリを割り当てる必要があります
メモリの割り当ては、このクラスと親クラスのすべてのインスタンス変数を含むが、任意の静的変数が含まれていません。
すべてのインスタンス変数のための2、割り当てのデフォルト値
この方法は、ヒープのインスタンス変数のコピー内に定義され、デフォルト値を割り当てます
図3に示すように、インスタンスの初期化コードが実行されます
初期化シーケンスが初期化され、再初期化サブクラスを初期化する例コードブロックを実行するために、第1の親クラスである場合、コンストラクタ
図4に示すように、同様の子供C =タイプ子参照変数CのC-引用定義の形で新しい子()、およびアドレスの割り当てがある場合れるスタック領域内のオブジェクトのヒープ領域
ことを注意各サブクラスのオブジェクトは親オブジェクトへの参照を保持し、親オブジェクトは、superキーワードが内部で呼び出されますが、外部からアクセスすることはできませんすることができます
彼は加えました:
情報の実際の型は、検索中のオブジェクトのメソッドを起動したときに親クラスの型情報を探しに行くために言葉を見つけることができない、参考例でインスタンスメソッドを呼び出します。
継承階層が深い場合は、親クラスを呼び出すメソッドが上位比較に位置しており、すべての呼び出しは見つけることが何度も通過するので、コールの効率は、比較的低いです。この時間は、システムは、主に呼び出さ使用される仮想メソッドテーブルコールの効率を最適化する方法。
いわゆる仮想メソッドテーブル、クラスがロードされるとき、すなわち、各テーブルのクラスを作成し、このテーブルは、親クラスを含むクラスのオブジェクトの結合すべてのメソッドと、そのアドレスの動的を含むが、この方法は、1つのレコードのみですサブクラスの後になるだけサブクラス保存親クラスのメソッドをオーバーライドします。場合は、動的バインディング法によるオブジェクト、ちょうどそれぞれの親のための一つ一つを発見する必要がなく、それにルックアップテーブル。
クラスが最初に表示されますとき、それは最初のクラスの完全修飾名を経由してロードされますされていない場合、新しいJavaオブジェクトではオブジェクト所属は、メモリにロードされていません。クラス終了後ロードおよび初期化した後、作業オブジェクトを作成しています。
:私たちの最初の仮定は、新しいオブジェクトは、2つの工程に分けることができ、その場合、このタイプの最初の使用、ということである負荷と初期化クラスとオブジェクトを作成します。
まず、クラスローディング手順(最初のクラスを使用して)
Javaは使用することです、親委任モデルを、我々はその作業工程を見て、ロード処理を説明する前に、クラスをロードするために、そのクラス:
両親は、委託業務プロセスモデルは次のとおりです。クラスローダ(クラスローダー)は、要求クラスがロードされている受信あれば、それは最初にこのクラスをロードしようとするが、それぞれのを完了するために、親クラスローダに要求を委託する所有していませんすべてのリクエスト究極の負荷は、彼らが要求を完了することはできませんフィードバックをロードする場合にのみ、親クラスローダ、ブートクラスローダのトップに転送する必要がありますので、レベルのクラスローダは(その検索に必要なものが見つかりませんでした、真であります)クラスをロードする際、サブローダは、独自のをロードしようとします。
効果的に、常にこれらのクラスの一つだけをロードする、ロードを実行するときに同じクラス名は、より限定されたプログラム、クラスローダを表示されたとき、クラスのグローバル一意性を保証する能力:両親を使用する利点は、メカニズムを委託します。
1、ロード
クラスローダは、バイナリバイトの読み出しを担当するクラスの完全修飾名に応じてJVMの内部に流入し、ゾーンにランタイムメモリ領域の方法を記憶し、次にターゲットのJavaの対応するタイプに変換されます。 lang.Classオブジェクトインスタンス
2、検証
フォーマットの検証:ファイル仕様クラスかどうかを確認し
、セマンティック検証:最終サブクラスが含まれているようなタイプがマークされているチェック、最終メソッドのチェックをクラスのサブクラスは上書きするかどうか; makeが必ず親と子のクラスの間には互換性がありませんいくつかのメソッド宣言(例えば、同じメソッドシグネチャ、メソッドの戻りが、異なる値として)
動作検証:データオペランドスタックは定数プール内の基準シンボルの検証を実行し、正しい操作でなければならない(典型的に解析フェーズを実行)シンボルが指定されたタイプの完全修飾名の位置を参照することによって説明することができるかどうかを確認し、アクセス修飾子クラスは、会員情報等へのアクセスを可能にします
3、準備ができて
すべてのクラスのメモリ空間の静的変数に割り当てられ、(オブジェクトが持っているので何のインスタンス変数は、この動作の範囲外ではない)の初期値を設定するために
、直接割り当てを静的最終変数(定数)を変更します。
4、構文解析
直接参照に符号定数プールを(直接メソッドを呼び出すために、クラスまたはフィールド、あるいはメモリ内のオフセットメソッドポインタを取得し)、これは、初期化後に行ってもよいです。
静的にバインドされるコンテンツのニーズを解析します。//すべての方法が書き換えられないだろうと静的結合ドメインになります
2,3,4またはそれ以上のステージとひとまとめに3つのリンクステージは、リンクステージは、JVMの動作状態に組み込まれるバイナリデータのバイトストリームのクラスにJVMにロードされる行います。
図5に示すように、初期化(父後サブ)
4.1静的変数への代入
静的コードブロック4.2を実行します
注:コードの静的なブロックのみJVM起動することができ
、複数のスレッドが同時にクラスを初期化する必要がある場合は、一つのスレッドだけが唯一の彼らは初期化を実行できるようにすることができ、スレッドは、唯一の後にクラスの初期化を実行するアクティブなスレッドで、残りのを待たなければなりません私たちは待っている他のスレッドに通知します。
そのため、親サブクラスへの依存のため、クラスの親クラスをロードするロード順序は、あまりにも、ロード、初期化のサブクラスです。親クラスの初期化、静的変数のサブクラスの値はまた、いくつかを持っている場合しかし、それはデフォルトです。
最後に、メソッド領域は、現在のクラスのクラス情報を含むクラス静的変数、クラス初期化コード(代入文静的変数の定義 と 静的初期化コードブロックは)、インスタンス変数が定義され、インスタンスの初期化コード(代入文インスタンス変数の定義コードブロックの例と工法)及び方法の例、ならびにクラス情報は、親クラスを参照します。
第二には、オブジェクトを作成します
図1に示すように、オブジェクトは、ヒープ内のメモリを割り当てる必要があります
メモリの割り当ては、このクラスと親クラスのすべてのインスタンス変数を含むが、任意の静的変数が含まれていません。
すべてのインスタンス変数のための2、割り当てのデフォルト値
この方法は、ヒープのインスタンス変数のコピー内に定義され、デフォルト値を割り当てます
図3に示すように、インスタンスの初期化コードが実行されます
初期化シーケンスが初期化され、再初期化サブクラスを初期化する例コードブロックを実行するために、第1の親クラスである場合、コンストラクタ
図4に示すように、同様の子供C =タイプ子参照変数CのC-引用定義の形で新しい子()、およびアドレスの割り当てがある場合れるスタック領域内のオブジェクトのヒープ領域
ことを注意各サブクラスのオブジェクトは親オブジェクトへの参照を保持し、親オブジェクトは、superキーワードが内部で呼び出されますが、外部からアクセスすることはできませんすることができます
彼は加えました:
情報の実際の型は、検索中のオブジェクトのメソッドを起動したときに親クラスの型情報を探しに行くために言葉を見つけることができない、参考例でインスタンスメソッドを呼び出します。
継承階層が深い場合は、親クラスを呼び出すメソッドが上位比較に位置しており、すべての呼び出しは見つけることが何度も通過するので、コールの効率は、比較的低いです。この時間は、システムは、主に呼び出さ使用される仮想メソッドテーブルコールの効率を最適化する方法。
いわゆる仮想メソッドテーブル、クラスがロードされるとき、すなわち、各テーブルのクラスを作成し、このテーブルは、親クラスを含むクラスのオブジェクトの結合すべてのメソッドと、そのアドレスの動的を含むが、この方法は、1つのレコードのみですサブクラスの後になるだけサブクラス保存親クラスのメソッドをオーバーライドします。場合は、動的バインディング法によるオブジェクト、ちょうどそれぞれの親のための一つ一つを発見する必要がなく、それにルックアップテーブル。