2013-10-11 12 views
6

オブジェクトを作成し、親クラスのコンストラクタが1つ実行されたとします。このコンストラクタを使用すると、親の新しいオブジェクトもバックグラウンドで作成されます。Javaオブジェクトをインスタンス化するとき、自動的に作成される親クラスのオブジェクトですか?

そうでない場合、親クラスのフィールドはどこに格納されていますか?実際には、親オブジェクトの任意のメソッド(superの有無にかかわらず)を呼び出すことができます。このメソッドは、呼び出し元オブジェクトの非表示のプライベートフィールドを操作します。

Javaメモリモデルに最も精通している人なら、彼または彼女の答えは大歓迎です!

+10

「親クラス」とは、「スーパークラス」を意味し、どのクラスのオブジェクトでもそのスーパークラスのオブジェクトです。ただ1つのオブジェクトがあります。 –

+0

'heap'と' stack'を見てください –

答えて

10

このコンストラクタを使用すると、親の新しいオブジェクトもバックグラウンドで作成されますか?

いいえ、インスタンスは1つだけ作成されます。作成されたインスタンスには、現在のクラスおよびすべてのスーパークラスの属性が含まれます。

もしそうでなければ、親クラスのプライベートフィールドはどこに格納されていますか?

すべてのクラス属性と同様に、ヒープに格納されます。現在のクラスまたはスーパークラスで定義されている場合は、メモリ位置の点で違いはありません。

+0

クールな説明+1 –

+2

+1各クラスは、同じ名前のフィールドを持つことができます。それらはすべて1つのオブジェクトにあります。 –

0

2つのオブジェクトを作成せず、サブクラスオブジェクトのみを作成します。

別のクラスから継承する場合は、コンストラクタでsuper()を呼び出す必要があります。そうしないと、コンパイラは明示的に見ることができるようにその呼び出しを挿入します。

スーパークラスのコンストラクタが呼び出されるのは、オブジェクトが初期化されていない状態になるためです。

0

継承は、基本クラスとサブクラスの間の "is a"関係であり、したがって、サブクラスのインスタンスを持つたびに、定義によって、(インスタンスの一部として)基本クラスのインスタンス、2つの別々のインスタンスとしてではありません)。基本クラスを適切に初期化するために、コンストラクタが呼び出されます。

関連する問題