オブジェクトはヒープ上に存在します。インスタンス変数で構成されています。メソッドも含まれていますか? オブジェクトからメソッドを呼び出すと、どのようにスタックに移動しますか?
オブジェクトを作成する場合
Test obj=new Test();
obj.start();
メソッドコードはどこにありますか? ヒープメモリまたは他の場所のオブジェクトにありますか?
オブジェクトはヒープ上に存在します。インスタンス変数で構成されています。メソッドも含まれていますか? オブジェクトからメソッドを呼び出すと、どのようにスタックに移動しますか?
オブジェクトを作成する場合
Test obj=new Test();
obj.start();
メソッドコードはどこにありますか? ヒープメモリまたは他の場所のオブジェクトにありますか?
メソッド コードはヒープではなく、クラス データが読み込まれるときにデータが取り込まれるメモリの静的領域にあります。オブジェクト インスタンスには、ランタイム システムが呼び出されたときに適切なメソッドを検索できるようにするこの静的メモリ領域への参照が含まれています。これが、メソッドのオーバーライドのしくみです。インスタンスのequals
メソッドを呼び出しているとします。実行時に JVM はクラスの静的メモリ領域を調べ、オーバーライドされたequals
メソッドのアドレスを見つけるか、スーパークラスの静的メモリ領域へのリンクをたどってそのequals
メソッドを見つけます。 JVMがオーバーライドさequals
れたメソッドを見つけたとき、またはJVMがObject
デフォルトのメソッドでメモリ領域を見つけたときに停止しますequals
。
メソッド コードは、インスタンスごとに複製されるわけではありません。各メソッドは一度だけ保存されます。
http://javapapers.com/core-java/java-jvm-memory-types/に見られるように:
(...)メソッド領域は非ヒープ メモリの一部です。クラスごとの構造、メソッドおよびコンストラクターのコードを格納します。クラスごとの構造とは、ランタイム定数と静的フィールドを意味します。