JavaのC++ポインタに似たものはありますか? あるなら、それが何なのか知りたいです。いくつか例を挙げていただけますか?
2 に答える
Java のポインター (言語仕様ではそう呼ばれていますが、Java プログラマーはほとんどが "参照" として認識していると思います) は、ポインター演算をサポートしていません。
また、Java にはポインター演算を行う方法がありません。
このような低レベルの処理を Java で行う場合、1 つの方法は、JNI (Java Native Interface) を使用して、C または C++ で記述されたコードにアクセスすることです。
Java オブジェクト モデルは、C++ のオブジェクト モデルとは異なります。
C++ では、すべての型に対して、その型の変数を持つことができます。さらに、すべての非参照型
T
には型がありT&
、その型の変数を持つことができます (ただし、参照は決してオブジェクトではありません)。Java では、クラス型である型を変数の型にすることはできません。クラス型のオブジェクトは動的にしか存在できず、型として宣言された変数
T
(T
はクラス型) は常に暗黙的にオブジェクトへの追跡された参照になります。(この議論ではプリミティブ型を無視しましょう。)
どちらの言語でも、変数にはスコープがあります。ただし、C++ では、有効期間が終了したオブジェクトは自動的にデストラクタを呼び出すため、スコープ付き有効期間を利用できます。Java では、唯一の変数は参照であり、変数がスコープ外になると、非常に異なることが起こります。つまり、追跡していたオブジェクトの参照が 1 つ少なくなったことがメモリ マネージャーに通知されます。ベースの参照が残っていない場合、オブジェクトは (非決定論的) コレクションの対象になります。
必要に応じて、Java のクラス型変数を C++ のポインターと同等にすることができます。
// Java:
{
Foo x = new Foo();
x = new Foo(); // no assignment in Java!
}
// C++:
{
Foo * px = new Foo;
px = new Foo; // ... leaks the previous object
}