>確かにJavaにはポインタがあると考えたほうが理解はしやすいでしょうが、
>やはり「厳密に言えば」無いと思います。
>
>まぁ理由はリンクしているページに書いてあるとおりなのですが。
>思います、なんて書いてるのは自身がJava仮想マシン仕様書を読んだことが無いからで・・・
ネットジーンの村山さんの文章ですね。
| Java言語にもJavaVMにも,C言語でいうようなポインタ(pointer) という
| 概念は全く存在しない.あるのは参照(reference)であり,参照と
| ポインタは異なる概念になる.
(中略)
| (C言語におけるポインタは単なる「アドレス値を保持する変数」に過ぎない.
| Cにおいては配列や文字列さえもポインタ演算で表現されている.これに対して
| 参照というのはもっと抽象的な概念で,保持するのがアドレス値であるとは限らない.
| 概念が異なるため,例えば「参照どうしの大小関係」や「参照と数値型との相互変換」
| などは,そもそも「定義」することができない.
Javaに「アドレス値」としてのポインタは存在しません。そんなことは当たり前で、
そういう意味での「ポインタ」がJavaにあるなどとは誰も主張していないでしょう。
少なくとも私は見たことがありません。村山さんの脳内にはいるのかもしれませんが。
ていうかそもそもCにおいても、ポインタ同士の大小章比較が保証されているのはひとつの
配列内だけだし、ポインタと数値型との相互変換はできますが、それで何が起きるかは
処理系定義なんですが、そういうことをわかって書いてるのかな。
| JavaVMの実装でC言語,及びそのポインタが使われることが多いのは事実だが,
(中略)
| それは実装依存の話でしかない.
実際、初期の実装では、コンパクションを容易にするために生アドレスではなく
オブジェクトハンドルを使っていました。「Java謎+落とし穴」ではそういうことも
書いているわけで(p.131)、私からすれば「だから何?」でしかないです。
| ポインタを「指し示すもの」という一般用語として解釈することも不可能
| ではないが,かなり言い訳じみている.
なぜこれが「言い訳じみている」のか、一言も説明してませんね。
PascalやModula2の立場はどうなるのか、とこれも「Java謎+落とし穴~」には
書きました(p.83)。
ところで、村山さんが根拠にしているはずの、JVMの仕様書には以下の記述があります。
http://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#29375
| There are three kinds of reference types: the class types (§2.8), the
| interface types (§2.13), and the array types (§2.15). An object is a
| dynamically created class instance or an array. The reference values
| (often just references) are pointers to these objects and a special null
| reference, which refers to no object.
参照値はポインタだって書いてあるじゃん。