参照は、アドレスを保存することで実装できます。 通常、 Java参照はポインターとして実装されますが、仕様では必須ではありません。ガベージコレクションを容易にするために、間接的な追加のレイヤーを使用している場合があります。しかし、最終的には(ほとんどの場合)(Javaスタイルの)参照の実装に関与する(Cスタイルの)ポインターに要約されます。
参照を使用してポインター演算を行うことはできません。CのポインターとJavaの参照の最も重要な違いは、Javaの参照の基になる値に実際にアクセスできない(および操作できない)ことです。言い換えれば、ポインター演算を行うことはできません。
Cでは、ポインタ(つまり、アドレス)に何かを追加したり、「近く」にあるものを指すように何かを減算したり、任意の場所にある場所を指すことができます。
Javaでは、参照は1つのこととそのことだけを指します。変数に別の参照を保持させることはできますが、「元の事の後の事」を指すように変数に求めることはできません。
参照は強く型付けされています。別の違いは、Javaでは、参照の型がCのポインターの型よりもはるかに厳密に制御されることです。Cでは、を使用してint*
それをキャストしchar*
、その場所でメモリを再解釈できます。この再解釈はJavaでは機能しません。参照のもう一方の端にあるオブジェクトは、既にあるものとしてしか解釈できません(つまり、Object
参照先のオブジェクトが実際にである場合にのみ参照にString
参照をキャストできます)。String
これらの違いにより、Cポインターはより強力になりますが、より危険になります。これらの可能性(ポインターの算術演算とポイントされる値の再解釈)の両方がCに柔軟性を追加し、言語の力の一部のソースです。しかし、それらは問題の大きな原因でもあります。間違って使用すると、コードが構築されているという前提を簡単に破ることができるからです。そして、それらを誤って使用するのは非常に簡単です。