14

Javaの参照とは正確には何ですか? メモリアドレスですか?Java 参照は逆参照された C++ ポインターと同等ですか?

つまり、次のようになります。

Object o1 = new Object();
Object o2 = new Object();

o1 == o2

上記の比較は、C++ で 2 つのポインターを比較するのと同じですか?

4

4 に答える 4

18

o1 == o2はい、C / C ++で2つのポインターを比較するのとほぼ同じです。

ただし、Java の参照と C/C++ のポインターには、非常に重要な 2 つの主な違いがあります。

  • Java 参照はポインター演算を実行できません。参照に「3 を追加」することはできません。別の (既知の) オブジェクトを指すようにすることしかできません。
  • Java 参照は厳密に型指定されています。参照の反対側にあるものを、そのオブジェクトが実際に型として再解釈しない限り、「再解釈」することはできません。

また、「参照」という言葉について簡単に説明します。C++ には、C のポインターと Java の参照の両方とはまったく異なる動作をする参照があります (ただし、C++ について詳細を説明するのに十分な知識はありません)。

これに関する完全な議論については、この関連する質問を参照してください。

于 2012-09-24T12:30:35.717 に答える
5

Javaの参照とは正確には何ですか?

オブジェクトのインデックスです。ポインターのようなものと考えることができますが、

  • いつでも変更できます。
  • 常にメモリ アドレスと直接関係があるとは限りません。
  • 通常、64 ビット JVM では 32 ビットです。
  • 参照が参照しているものを再解釈することはできません。参照自体のタイプのみを変更できます。

上記の比較は、C++ で 2 つのポインターを比較するのと同じですか?

はい。


On Compresses Oops により、64 ビット JVM が 32 ビット参照を訴えることができます。

Java HotSpot™ 仮想マシンのパフォーマンス強化 - Compressed Oops

Hotspot JVM の圧縮 oops

IBM V6 - 圧縮された参照を使用してヒープをより効果的に使用する

于 2012-09-24T12:31:56.527 に答える
4

はい、参照は基本的にポインタと同じものです。ちなみに、null 参照でメソッドを呼び出すと、NullPointerException が発生します。

ただし、メモリアドレスである必要はないことに注意してください。特定のオブジェクトは、プログラムの実行中に別の場所に格納でき、同じ参照を維持できます。しかし、Java にはポインター演算が存在しないため、気にする必要はありません。

于 2012-09-24T12:30:26.447 に答える
1

C++ とは異なり、Java はポインタの直接操作を排除しますが、参照は Java のメモリ アドレスへの「ポインタ」です。Java のオブジェクトは、メソッドに渡されることも、メソッドによって返されることもありません。渡されるのは常に参照です。

于 2012-09-24T12:32:39.707 に答える