Integer i = 88
の場合、i
のメモリアドレスは?Javaで非プリミティブ変数のアドレスを見つけることはできますか?
また、デバッガの一部としてid
の番号が変更された場合は、新しいオブジェクトが作成されたことを示していますか?
Integer i = 88
の場合、i
のメモリアドレスは?Javaで非プリミティブ変数のアドレスを見つけることはできますか?
また、デバッガの一部としてid
の番号が変更された場合は、新しいオブジェクトが作成されたことを示していますか?
2番目の質問に対する答えははいです。Eclipseのデバッガで表示される「id」はオブジェクトを一意に識別するため、その変更は新しいオブジェクトが作成されたことを意味します。したがって、たとえば:
ここで、iとkは同じオブジェクトを参照するため、同じIDを持ちます。 jは異なります。
これらのオブジェクトの1つのメモリアドレスは、オブジェクトがメモリ内を移動するため、実際には有用な情報ではありません。あなたが知ることができるのは、i == kの場合、それらは同じオブジェクトです。 (だからここではi == kだがi!= j)。
なぜあなたはJavaで任意のオブジェクトのメモリアドレスが必要でしょうか?あなたが言うことができるのは、Integer
インスタンスがヒープにあるということだけです。あなたは正確な住所を見つけることができません。
第2の質問:はい、Integer
のオブジェクトは不変なので、タイプがInteger
の変数の値が変更された場合、Integer
の別のインスタンスを示します。ただし、必ずしも新しいインスタンスがを作成したことを意味するわけではありません。 new Integer(42)
は常に新しいインスタンスを作成し、Integer.valueOf(42)
は呼び出されるたびに同じインスタンスを作成します。
JVM開発チームから非常に近いものがないと、参照変数に格納されているデータ/アドレスのタイプがわかりません。私たちが必要とするのは、その参照に存在するオブジェクトへのアクセスとそれを操作/実行することだけです。
質問の第2部分についてはわかりません。また、ID(デバッガで)がJavaヒープメモリの場所を参照するかどうか確認できません。
id番号は何ですか? – Adrian