「値セマンティクス」とは何を意味し、「暗黙的なポインターセマンティクス」とは何を意味しますか?
4 に答える
Java は、オブジェクト型に暗黙的なポインター セマンティクスを使用し、プリミティブに値セマンティクスを使用しています。
値のセマンティクスとは、値を直接処理し、コピーを渡すことを意味します。ここでのポイントは、あなたが価値を持っているとき、それがあなたの後ろで変わらないことを信頼できるということです.
ポインターのセマンティクスでは、値はなく、「アドレス」があります。他の誰かがそこにあるものを変更する可能性があります。あなたにはわかりません。
C++ のポインタ セマンティクス :
void foo(Bar * b) ...
... b->bar() ...
ポインターのセマンティクスを要求するには * が必要で、ポインティング先のメソッドを呼び出すには -> が必要です。
Java での暗黙的なポインター セマンティクス :
void foo(Bar b) ...
... b.bar() ...
値のセマンティクスを使用する選択肢がないため、* は必要なく、-> と . の区別も必要ないため、暗黙的です。
基本的に、値のセマンティクスは、ある値を別の値に代入するとコピーが作成されることを意味します。
int x = 1;
int y = x;
x = 2; // y remains the same!
特殊なケースは、引数を渡される関数呼び出しです。
void f(int x) {
x = 5;
}
int a = 1;
f(a);
// a is still 1
これは実際には Java と C++ で同じです。ただし、Java が認識できるプリミティブ型は、int
、 、double
、boolean
およびchar
このように動作する列挙型だけです。他のすべての型は参照セマンティクスを使用します。つまり、ある値を別の値に代入すると、基になる値をコピーするのではなく、実際にポインターがリダイレクトされます。
class Foo {
int x;
public Foo(int x) { this.x = x; }
}
Foo a = new Foo(42);
Foo b = a; // b and a share the same instance!
a.x = 32;
//b.x is now also changed.
ただし、いくつかの注意事項があります。たとえば、多くの参照型 ( String
、Integer
…) は実際には不変です。それらの値は変更できず、それらへの割り当ては古い値を上書きします。
また、引数は引き続き値渡しされます。これは、関数に渡されるオブジェクトの値は変更できますが、その参照は変更できないことを意味します。
void f(Foo foo) {
foo.x = 42;
}
void g(Foo foo) {
foo = new Foo(42);
}
Foo a = new Foo(23);
f(a);
// a.x is now 42!
Foo b = new Foo(1);
g(b);
// b remains unchanged!
Javaは値渡しです。C ++は、値と参照の両方のセマンティクスを使用できます。
Java はimplicit pointer semantics
on変数アクセスを使用し(参照を直接編集することはできません。アクセス時に自動的に (暗黙的に) オブジェクトに解決されます)、Pass-by-Value semantics
onメソッド パラメーターの受け渡しも使用します。
Java アプリケーションでの値渡しセマンティクスを参照してください。
Java アプリケーションでは、オブジェクト参照がメソッドへのパラメーターである場合、参照自体ではなく、参照のコピー (値渡し) を渡します。呼び出し元のメソッドのオブジェクト参照とコピーが同じオブジェクトを指していることに注意してください。これは重要な違いです。Java アプリケーションは、C++ のようにさまざまな型のパラメーターを渡す場合に、何も違いはありません。Java アプリケーションはすべてのパラメーターを値で渡すため、型に関係なくすべてのパラメーターのコピーを作成します。
短い: Java のすべてのパラメーターは、値によって渡されます。ただし、これはオブジェクトがコピーされるという意味ではなく (PHP4 のデフォルトのように)、そのオブジェクトへの参照がコピーされます。
Java アプリケーションでの値渡しセマンティクスに関するすべての説明と詳細な例が表示されます。