2016-12-28 10 views
0

このようなものはどのようにメモリ(スタック、ヒープなど)に保存されますか?多形性におけるメモリ管理はどのようにして行われますか?

public class Animal { 
    // Stuff 
} 

public class Dog extends Animal { 
    // Stuff 
} 

public class Test { 
    public static void main(String[] args) { 
     Animal bello = new Dog(); 
    } 
} 

どのようにこれは、次のとおりです。Animal bello = new Dog();は、メモリの的に管理しますか? belloはタイプAnimalの参照ですが、それが指していたオブジェクトのタイプがDog

+0

あなたが何を求めているかわからない。 _reference_ 'bello'は' main'のローカルなので、スタックに入ります。あなたが 'new'で作成したので、' Dog '自体はヒープになります。しかし、これは、すべてのオブジェクトとそれらを参照するすべてのローカル変数で同じです。継承は違いはありません。 –

+0

@DavidWallace参照のデータ型がオブジェクトのものと同じでない場合は、それは何の違いもありませんか? –

+0

いいえ。オブジェクトはそれ自身の 'class'を知っていますが、それを参照する変数の型は分かりません。 –

答えて

0

とき がどのようにこれはメモリに保存されているJavaは、参照型としてクラスを定義します。 Java specificationsは、これがどのように機能するかを説明します。

4.3.1オブジェクト
オブジェクトをクラスのインスタンスまたは配列です。
これらのオブジェクトへの参照値(参照のみ)は、ポインタ で、特別なヌル参照は、 オブジェクトを参照していません。

言語はこの実装の詳細を完全に隠しますが、参照は(パラメータとして、またはスタック上のローカル変数として、またはヒープ内のオブジェクトフィールドとして)渡され、実際の値メモリ内のオブジェクト(ヒープ内)。だから、書くとき:

Animal bello = new Dog(); 

JVMは、ヒープメモリにDogオブジェクトを割り当てますとnewはそれを見つけるために参照を返します。代入は参照をローカル変数belloにコピーするだけです(コンパイラは型が互換性があることをチェックしています)。

トリックはオブジェクトレイアウト内にあります。単純にするために、オブジェクトは実際のクラスを追跡します。コンパイラはDogオブジェクトのレイアウトがAnimalレイアウトの拡張である巧妙なレイアウトを作成します。メソッドを呼び出すと、実際のオブジェクトのクラスに対応するメソッドが呼び出されます。もちろん、実際にはこれはすべてa little more complexです。

+0

ちょうど賢いニックピック:" JVMはヒープメモリにDogオブジェクトを割り当てます " - これは必ずしも真実ではありません。 JVMは、現在のスタックフレームからエスケープしないことを静的分析によって判断できる場合、Dogオブジェクトをスタックに割り当てることができます。詳細はJava開発者のBrian Goetzの記事(http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html)を参照してください。 –

+0

@PeriataBreatta非常に興味深い記事!ありがとうございました !私のここでの意図は、経験則と一般原則の理解を与えることでした。 – Christophe