下の写真を見てください。キーワードを使用して Java でオブジェクトを作成するとnew
、OS からメモリ アドレスが取得されます。
書き込むout.println(objName)
と、「特別な」文字列が出力として表示されます。私の質問は次のとおりです。
- この出力は何ですか?
OSから与えられたメモリアドレスの場合:
a) この文字列をバイナリに変換するにはどうすればよいですか?
b) 1 つの整数変数アドレスを取得するにはどうすればよいですか?
下の写真を見てください。キーワードを使用して Java でオブジェクトを作成するとnew
、OS からメモリ アドレスが取得されます。
書き込むout.println(objName)
と、「特別な」文字列が出力として表示されます。私の質問は次のとおりです。
OSから与えられたメモリアドレスの場合:
a) この文字列をバイナリに変換するにはどうすればよいですか?
b) 1 つの整数変数アドレスを取得するにはどうすればよいですか?
これは、 「@」文字で区切られたクラス名とSystem.identityHashCode()です。ID ハッシュ コードが何を表すかは、実装によって異なります。多くの場合、これはオブジェクトの初期メモリ アドレスですが、時間の経過とともに VM によってオブジェクトがメモリ内で移動される可能性があります。したがって、(簡単に言えば)それが何かであることに依存することはできません。
JVMは自由にオブジェクトを実装し、それらを適切に移動できるため、変数のメモリアドレスを取得することはJava内では無意味です(オブジェクトはガベージコレクションなどで移動する可能性があります/移動します)。
Integer.toBinaryString()は、整数をバイナリ形式で提供します。
これは、オブジェクトの「toString()」実装の出力です。クラスが toString() をオーバーライドすると、まったく異なるものが出力されます。
取得しているのは、ObjectクラスのtoString()メソッドの結果、より正確には、uzay95が指摘しているidentityHashCode()の結果です。
「新しいキーワードを使用してJavaでオブジェクトを作成すると、OSからメモリアドレスを取得します。」
Javaで行うことはすべて、Java仮想マシンによって処理されることを理解することが重要です。この情報を提供しているのはJVMです。ホストオペレーティングシステムのRAMで実際に何が起こるかは、JREの実装に完全に依存します。