2017-04-17 6 views
0

私たちはJavaでhandleの概念は何ですか?

Emp e = new Emp(); 

クラスすなわちをインスタンス化するとき、ハンドルが、それはメモリ内のオブジェクトのアドレスを格納していないポインタすなわちない変数eに格納されていること。サイト(http://www.rajeshpatkar.com/articles/javarefpnt/)で読みます

説明は、ポインタの配列の例を示します。メモリアドレスは[1]の位置に格納され、オブジェクトが移動されると、この位置は新しいアドレスで更新されます。

なぜこの配列ではなく、オブジェクトが移動したときに、直接アドレス(それがGCに役立つと述べているが、私はそれを理解していなかった)、それを更新する(電子に格納されたアドレス)を格納するのに使用されますか?

私はこれを理解するのにかなりの時間を費やしましたが、それでも私を満足させる答えは見つかりませんでした。 変数 'e'に実際に何が格納されているかを説明することができれば(例で)、静かに役立ちます。

感謝:)

答えて

5

通常の用語ではなく、「オブジェクト参照」(または単に「参照」)である「ハンドル。」

オブジェクト参照は、特定のオブジェクトをJVMに一意に識別する不透明な値です。その値の形式は、以外の仕様では定義されていません。私はそれが一般的にintまたはlongの大きさだ疑いがあるが、私はそれさえもがJLSまたはJVMスペックのいずれかで覆われているとは思いません。 (あなたに考えを与えるために、null [特別な値は「参照なし」を意味する]の正確な値さえも必須ではないことをJVM仕様書は明示的に指摘しています)。

参照はポインタではありません形式が指定されていない場合、その事実が仕様に違反して悪用されない限り、ポインタを参照として使用してJVMを実装することは可能です。

参考文献はポインタではないので、JavaにはCやその関連言語のような「ポインタ算術」はありません。

実際に変数「e」に格納されていることを説明できれば、静かに役立ちます。

これは仕様で定義されていません。それはオブジェクトを一意に識別する値です(その値は決してわかりません; System.outを使用してtoStringを実装していないオブジェクトを印刷するときに表示される16進値がオブジェクトの参照であるという神話は、 )。 この値は、オブジェクトがJVMの実装に依存していることを示します。ポインタかもしれない。それはポインタの配列へのインデックスかもしれません。それは、異なるもののための参照値からの異なるビットを使用して、より複雑になる可能性があります。

+0

大きな説明メイト。私はついにハンドルのコンセプトを理解しました。ポインタの配列例を続けると、すなわち、 'e'(参照変数)はa [1]を指し、これは順番に(すなわち、[1])オブジェクトのアドレスを記憶する。さらに、私はeの値を変更できないことを知りました。すなわち、eの点をjavaの[5]または他のメモリにすることはできません。内容[a]に格納されている値だけを変更できます。なぜこれがJavaの理由なのですか?つまり、Javaの他の場所に 'e'を付けることができないのはなぜですか?許可する可能性のあるリスクは何ですか? –

+2

@JayeshSaita:喜んで助けました。 * "...さらに、私は 'e'の値を変更することができないことを知りました..." *はい、できます: 'e = someOtherObject;' JVMの実装方法に慣れないでください。ちょうど:変数は値を格納します。参照型変数に格納される値はオブジェクト参照です。その値は、オブジェクトがどこにあるかをJVMに伝えます。 :-) –

1

ハンドルは、ポインタではない変数eに格納されます。 は、オブジェクトのアドレスをメモリに格納しません。

すべての実際的な目的には、オブジェクトのアドレスをメモリに格納すると仮定できます。

しかし、Javaでは、明示的にメモリを管理することはできません。つまり、この種の変数をメモリ内の特定の位置を指すようにすることはできません。この変数を特定のインスタンスを指すようにすることができます。

+0

* "すべての実用目的に..." * - 圧縮されたoopsを除いて - http://stackoverflow.com/questions/25120546/trick-behind-jvms-compressed-oops –

+0

Trueの場合、64の場合 – Andres

+0

実用的なものではありません。オブジェクト参照を整数に変換することで通常実装されているhashcode()があります(これは必須ではありません)。代わりにメモリ内のポインタに依存すると、このインスタンスのすべてのGCの動きによって、オブジェクトが変更されていなくても、異なるハッシュコードが返されます。 hashcode()の契約に違反しています。 –

関連する問題