親クラスのコンストラクターの呼び出しは true ですが、親クラスのオブジェクトはまったく作成されず、プロパティを初期化するために親クラスのコンストラクターを呼び出しているだけです。
親クラスのコンストラクターを呼び出すことが親クラスのオブジェクトを作成することと同じであると言うなら、それは本当にナンセンスです。
新しい命令により、オブジェクトのさまざまな属性参照を保存するために使用されるスペースが開かれます。バイトコードを逆コンパイルすると、新しい命令が 1 つだけあることがわかり、スペースが開かれ、各スペースに 1 つのオブジェクトが配置されます。 。
その後、サブクラスが親クラスのプロパティ、メソッドなどを呼び出すとき、それはインスタンス化されたオブジェクトではありません。
バイトコードでは、サブクラスは CONSTANT_Class_info タイプに属する u2 タイプの親クラス インデックスを持ち、CONSTANT_Class_info の記述を通じて見つけることができ、指定された親クラスを見つけることができます。
あなたのメソッドでは、属性名がこれに基づいて解析され、実際の変数の内容が new によって作成されたスペースに保存されます。 。 。
super キーワードは、この空間の特定の部分 (つまり、親クラス データの保存専用のメモリ部分) のデータにのみアクセスします。 。 。 。 。 。
サブクラスを強制的に親クラスに変換して利用できるのは、Java仮想マシンに静的型(見た目の型)と実体型の概念があるからです。
例えば、Object t=new Point(2,3);
この場合、Objectは静的型(見た目型)に属し、Pointは実体型に属します。
静的型と実際の型はどちらもプログラム内で変更できます。違いは、静的型の変更は使用時にのみ発生するのに対し、変数自体の静的型は変更されず、最終的な静的型はコンパイル中に判明することです。実際の変数の型の変更結果は、実行時にのみ判断できます。コンパイラは、コンパイル時に変数の実際の型を知りません。Java オブジェクトのメモリ レイアウトは、オブジェクトが割り当てられるクラスによって決まります。所属しています。クラスが仮想マシンにロードされるとき、このクラスによって作成されるオブジェクトのレイアウトはすでに決定されているとも言えます。
オブジェクト本体には主に Java オブジェクト自体のインスタンス フィールドと親クラスから継承したインスタンス フィールドが格納され、内部レイアウトは次の規則を満たします:
規則 1: すべてのオブジェクトは 8 バイトの粒度で整列されます。 ルール 2: インスタンス フィールドは、long 型と double 型、整数型と浮動小数点型、文字と short 整数型、そして最後に参照型に従って配置されます。これらのインスタンス フィールドは、それぞれの単位に従って配置されます。
ルール 3: 異なるクラスの継承関係にあるインスタンス フィールドを混合することはできません。まず、親クラスのインスタンス フィールドがルール 2 に従って処理され、続いてサブクラスのインスタンス フィールドが処理されます。
上記はJavaオブジェクトのメモリレイアウトのルールです。
次に、Java オブジェクトのインスタンス化メソッド、つまり一般的なメソッドについて説明します。新しいオブジェクトを作成すると、jvm は実際にオブジェクトのスペース全体を割り当て、オブジェクト全体のインスタンス ドメイン レイアウトが決定されます。
インスタンス化メソッドは、オブジェクト インスタンス フィールドの値を対応するスペースに設定します。
例で説明しましょう:
class Parent {
private short six;
}
class Sub extend Parent{
private String name;
private int age;
private float Price;
}
super とは、いわゆる親クラスの記憶領域の表現を意味しますか?
ここのスーパーストレージは緑色のものだと思います!
以上がJava継承における親クラスオブジェクト作成の問題の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。