値セマンティクスとは何ですか’および‘ポインターセマンティクス’平均?
-
03-07-2019 - |
質問
‘値セマンティクス’が意味するもの、および‘暗黙的なポインターセマンティクス’が意味するもの
解決
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は変数アクセスで暗黙のポインターセマンティクス
を使用します(参照を直接編集することはできません。自動的に(暗黙的に)アクセス時にオブジェクトに解決されます) 渡すパラメーターのセマンティクス
。
Javaアプリケーションでは、オブジェクトが 参照はメソッドへのパラメーターであり、 あなたはのコピーを渡している 参照(値渡し)ではなく 参照自体。ことに注意してください メソッドのオブジェクト参照の呼び出し コピーは同じものを指している オブジェクト。これは重要です 区別。 Javaアプリケーションは 合格するとき、何も変わりません C ++などのさまざまなタイプのパラメーター します。 Javaアプリケーションはすべて合格 値ごとのパラメータ、したがって に関係なく、すべてのパラメーターのコピー タイプ。
ショート:Javaのすべてのパラメーターは値で渡されます。しかし、それはオブジェクトがコピーされることを意味するのではなく(PHP4のデフォルトのように)、そのオブジェクトへの参照はコピーされます。
すべての説明と詳細な例は、 Javaアプリケーションでの値渡しのセマンティクス