Javaの参照変数はどのように保存されますか? それはCポインターに似ていますか?
参照変数の意味は、このコードの myDog です
Dog myDog = new Dog();
Cのポインタについては、グローバル変数ならヒープに、ローカル変数ならスタックに格納するということがわかりました。Javaも同じように動作するのだろうか。
Java メモリ構成の下位レベルについて少し理解する必要があります。スタックには、プリミティブ (int、double、boolean など) とヒープを指すオブジェクト参照が格納されます。
どのオブジェクトの内部でも同じことが当てはまります。他のオブジェクトまたはプリミティブへの参照が直接含まれています。オブジェクトは常にどのコンテキストでも参照であり、それらの参照は値によって渡されます。
したがって、次のようになります。
[ STACK ] [ HEAP ]
int a: 10; -> MyWrapperObject@21f03b70====||
double b: 10.4; | || int someField: 11 ||
MyWrapperObject@21f03b70 ------| || String@10112222 ----------
...... ||==========================|| |
|
|
String@10112222============||<----
|| ... ||
|| ... ||
}}=========================||
場合によっては (JVM 内部を介する場合など)、オブジェクトが非ヒープ メモリに格納される場合があることに注意してください。
通常、ローカル変数はスタックに格納されます。インスタンス変数はヒープに格納されます。
Java も同じように動作します。Java の変数は値としてオブジェクトを持たないことに注意してください。すべてのオブジェクト変数 (およびフィールド) は、オブジェクトへの参照です。オブジェクト自体は、Java 仮想マシンによってどこか (通常はヒープ上) に保持されます。Java には自動ガベージ コレクションがあるため、(C とは異なり) オブジェクトの解放について心配する必要はありません。それへのすべてのライブ参照が範囲外になると、最終的にはガベージ コレクターによって一掃されます。
例えば:
Dog myDog = new Dog();
someMethod(myDog);
someMethod
によって参照される犬オブジェクトへの参照に渡しますmyDog
。内部で発生する可能性のあるオブジェクトへの変更は、メソッドが戻った後にsomeMethod
表示されます。myDog
同様に機能します。実際に起こっていることは、オブジェクト自体がヒープに格納され、C ポインターのようなオブジェクトへの参照がローカル変数に格納されることです。
これは C ポインターとまったく同じであり、ほとんど常にスタック上にあります。C では、オブジェクト自体はヒープ上にありますnew Dog();
が、Dog * myDogP
ポインタ (4 または 8 バイト) はヒープ上にある必要はなく、通常はスタック上にあります。