ホームページ  >  記事  >  Java  >  Java継承における親クラスオブジェクト作成の問題の詳細説明

Java継承における親クラスオブジェクト作成の問題の詳細説明

PHP中文网
PHP中文网オリジナル
2017-06-20 10:18:431737ブラウズ

親クラスのコンストラクターの呼び出しは true ですが、親クラスのオブジェクトはまったく作成されず、プロパティを初期化するために親クラスのコンストラクターを呼び出しているだけです。

親クラスのコンストラクターを呼び出すことが親クラスのオブジェクトを作成することと同じであると言うなら、それは本当にナンセンスです。
新しい命令により、オブジェクトのさまざまな属性参照を保存するために使用されるスペースが開かれます。バイトコードを逆コンパイルすると、新しい命令が 1 つだけあることがわかり、スペースが開かれ、各スペースに 1 つのオブジェクトが配置されます。 。
その後、サブクラスが親クラスのプロパティ、メソッドなどを呼び出すとき、それはインスタンス化されたオブジェクトではありません。
バイトコードでは、サブクラスは CONSTANT_Class_info タイプに属する u2 タイプの親クラス インデックスを持ち、CONSTANT_Class_info の記述を通じて見つけることができ、指定された親クラスを見つけることができます。
あなたのメソッドでは、属性名がこれに基づいて解析され、実際の変数の内容が new によって作成されたスペースに保存されます。 。 。
super キーワードは、この空間の特定の部分 (つまり、親クラス データの保存専用のメモリ部分) のデータにのみアクセスします。 。 。 。 。 。

デフォルトのハッシュコードとequals(直接使用される==比較)は同じであるため、これは基本的に同じ空間にあり、別個の親クラスオブジェクトはありません。


サブクラスを強制的に親クラスに変換して利用できるのは、Java仮想マシンに静的型(見た目の型)と実体型の概念があるからです。
例えば、Object t=new Point(2,3);
この場合、Objectは静的型(見た目型)に属し、Pointは実体型に属します。
静的型と実際の型はどちらもプログラム内で変更できます。違いは、静的型の変更は使用時にのみ発生するのに対し、変数自体の静的型は変更されず、最終的な静的型はコンパイル中に判明することです。実際の変数の型の変更結果は、実行時にのみ判断できます。コンパイラは、コンパイル時に変数の実際の型を知りません。Java オブジェクトのメモリ レイアウトは、オブジェクトが割り当てられるクラスによって決まります。所属しています。クラスが仮想マシンにロードされるとき、このクラスによって作成されるオブジェクトのレイアウトはすでに決定されているとも言えます。

ホットスポットでの Java オブジェクトのメモリ レイアウト:
各 Java オブジェクトは、メモリ内のオブジェクト ヘッダーとオブジェクト本体で構成されます。
オブジェクト ヘッダーには、オブジェクトが属するクラス オブジェクト Class への参照や、ハッシュコードとモニターに関する情報など、オブジェクトのメタ情報が格納されます。

オブジェクト本体には主に Java オブジェクト自体のインスタンス フィールドと親クラスから継承したインスタンス フィールドが格納され、内部レイアウトは次の規則を満たします:

規則 1: すべてのオブジェクトは 8 バイトの粒度で整列されます。

ルール 2: インスタンス フィールドは、long 型と double 型、整数型と浮動小数点型、文字と short 整数型、そして最後に参照型に従って配置されます。これらのインスタンス フィールドは、それぞれの単位に従って配置されます。
ルール 3: 異なるクラスの継承関係にあるインスタンス フィールドを混合することはできません。まず、親クラスのインスタンス フィールドがルール 2 に従って処理され、続いてサブクラスのインスタンス フィールドが処理されます。

ルール 4: 親クラスの最後のメンバーとサブクラスの最初のメンバーの間の距離が 4 バイト未満の場合、距離は 4 バイトの基本単位まで拡張されなければなりません。
ルール 5: サブクラスの最初のインスタンス フィールドが double または long 整数で、親クラスが 8 バイトを使い切っていない場合、JVM は int (int)、short (short) に従ってルール 2 に違反します。バイト型(byte)、参照型(reference)、埋められていないスペースを埋める順序。

上記はJavaオブジェクトのメモリレイアウトのルールです。

次に、Java オブジェクトのインスタンス化メソッド、つまり一般的な メソッドについて説明します。新しいオブジェクトを作成すると、jvm は実際にオブジェクトのスペース全体を割り当て、オブジェクト全体のインスタンス ドメイン レイアウトが決定されます。
インスタンス化メソッド は、オブジェクト インスタンス フィールドの値を対応するスペースに設定します。

メソッドは、親クラスの メソッドを呼び出すことで始まり、独自のコンストラクター メソッドで終了します。インスタンス フィールドの宣言とインスタンス初期化ステートメント ブロックの間の位置関係は、コンパイラによって生成される メソッドのバイトコード順序に影響します。

例で説明しましょう:
class Parent {
private short six;

private int age;

}

class Sub extend Parent{
private String name;
private int age;
private float Price;
}

Sub オブジェクトの現在のメモリ レイアウトは次のとおりです:


super とは、いわゆる親クラスの記憶領域の表現を意味しますか?
ここのスーパーストレージは緑色のものだと思います!


以上がJava継承における親クラスオブジェクト作成の問題の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。