web-dev-qa-db-ja.com

ポインターは本当にJavaに存在しますか?

私はインターネットでかなりの数のリソースを読みましたが、今ではJavaでのポインターの存在についてかなり混乱しています。

ポインタがあると主張する人もいれば、そのような概念はないと主張する人もいます。だから真実は何ですか?

4
log N

額面通り、公式の Java言語仕様 は特にポインタについて言及しているため、答えは[〜#〜]はい[〜#〜]、ポインタはJavaに存在します。

では、ここで明らかに矛盾する見解を説明するにはどうすればよいのでしょうか。まあ、多くの問題のように、意見の相違は意味論に帰着します。

"pointer" という用語は、メモリアドレスを明示的に格納する変数であるC/C++のポインタの概念と強く関連しています。 、および任意のアドレスを指すように算術的に変更できます。 Javaにはポインターが存在しますが、ファーストクラスの言語概念としては存在しません。むしろ、ポインターは参照の実装の詳細としてのみ存在します。スペックは言う:

オブジェクトは、クラスインスタンスまたは配列です。

参照値(多くの場合、参照のみ)は、これらのオブジェクトへのポインターと、オブジェクトを参照しない特別なnull参照です。

また、null参照にアクセスするとNullPointerExceptionではなくNullReferenceExceptionがスローされることも示しています。したがって、Javaデザイナーは、Java言語仕様を書いたとき、少なくともポインタの観点から考えていました。(実際にはNullReferenceException;私の意見では、その例外の名前は抽象化を通じてリークします)

したがって、答えはJava参照は「ポインタっぽい」であり、(C++参照のほとんどの実装と同様に)ポインタの観点から実装されているという意味ですが、Java参照は、プログラマが実際のメモリアドレスを操作することを制限する、より高いレベルの抽象化を提供します。構文的には、Java参照は、指定されたメンバーまたはメソッドへのアクセスのみを提供します-to Object-notObjectのメモリ位置。

そのため、はい、特定の「存在」の値に対してポインタがJavaに存在します。しかし、Java言語の概念について議論するとき、「ポインタ」の観点から話すことはおそらく役に立たないでしょう。

16
Charles Salvia

Javaにはポインタがあります。 Javaでオブジェクトを作成するときはいつでも、実際にはオブジェクトへのポインターを作成しています。このポインタは別のオブジェクトまたはnullに設定でき、元のオブジェクトは引き続き存在します(ガベージコレクションは保留中)。

Javaで実行できないことはポインタ演算です。特定のメモリアドレスを逆参照したり、ポインタをインクリメントしたりすることはできません。

本当に低レベルにしたい場合、それを行う唯一の方法は Java Native Interface; を使用することです。それでも、低レベルの部分はCまたはC++で実行する必要があります。

7
nmkyuppie