6

を使用して関数が呼び出された場合、関数Call-by-Reference内の変数に加えられた変更は、呼び出し元にすぐに反映されます。のCall-by-Sharing場合は、関数の最後で影響を受けます。

質問 1: Java はCall-by-Sharing代わりに を使用しCall-by-Referenceますか?

質問 2:マルチスレッド中のみCall-by-Sharingとは異なると思います。他のスレッドで使用されている間、値の同時上書きを減らすためにのみ作成されます。一貫性を提供します。私は正しいですか?Call-by-Reference

4

3 に答える 3

9

「共有による呼び出し」という用語を使用しないことをお勧めします。このウィキペディアの記事には次のように記載されています。

「しかし、「共有による呼び出し」という用語は一般的に使用されていません。用語はさまざまなソース間で一貫していません。たとえば、Java コミュニティでは、Java は値渡しであると言われていますが、Ruby コミュニティでは、彼らは2 つの言語が同じセマンティクスを示しているにもかかわらず、Ruby は参照渡しであると言います[要出典]. 共有による呼び出しは、言語の値がプリミティブ型ではなくオブジェクトに基づいていることを意味します。

「この用語は Python コミュニティで広く使用されていますが、Java や Visual Basic などの他の言語での同一のセマンティクスは、多くの場合、値がオブジェクトへの参照であることが暗示される値渡しとして説明されます。」

肝心なのは、Java は「共有による呼び出し」を使用しているということです... しかし、彼らはそれをそう呼んでいません。


Call-by-Sharing と Call-by-Reference の違いは、マルチスレッドの場合だけだと思います。他のスレッドで使用されている間、値の同時上書きを減らすためにのみ作成されます。一貫性を提供します。私は正しいですか?

いいえ、あなたは正しくありません。

値がオブジェクト参照である場合、「共有による呼び出し」は実際には「値による呼び出し」を意味します。真の「参照による呼び出し」とは、(事実上) 変数のアドレスを渡していることを意味し、呼び出されたメソッドは変数を更新できます。

于 2012-12-17T03:12:26.297 に答える
2

Java が値渡しであることはよく知られていますが (より一般的な用語を使用すると)、オブジェクト参照をメソッドに渡すと、そのメソッドが呼び出し元のスコープ内のオブジェクトを変更できるという事実から、多くの混乱が生じます。 (つまり、オブジェクトを「共有」します)。そのため、一部の人々は、Java が非プリミティブの参照渡しであると誤って信じています。私が理解しているように、何かが「共有による呼び出し」であると言うことは、渡す値がオブジェクト自体ではなく、オブジェクトへの参照であることを明確にするだけです。

対照的に、R のような言語は値渡しですが、ベクトルのような非プリミティブをディープ コピー (私が収集した技術的にはコピー オン ライト) として渡します。呼び出し元のスコープ内のベクトル。

あなたの2つの質問に具体的に答えるために、はい、あなたがリンクしたウィキペディアの記事から理解するようになったので、Javaは「共有による呼び出し」です。ただし、call-by-sharing と call-by-reference があなたの説明と異なることに同意しません。1 つの違いは、call-by-sharing で 2 つの変数を交換するメソッドを作成できないことです。

于 2012-12-16T08:22:26.877 に答える
0

オブジェクトの名前がメモリ内のオブジェクトへの参照である言語では、オブジェクト (オブジェクトへの参照) を渡すときに共有による呼び出しを使用して、参照がコピーされ、実パラメーターと仮パラメーターの両方が同じオブジェクトを参照します。 . これは、値による呼び出しまたは参照による呼び出しとどう違うのですか...

そのため、この用語を使用する非常に少数の人々 (つまり、Clu プログラマー) にとって、call-by-sharing は call-by-value とは異なります。実際のパラメーターを仮パラメーターにコピーしますが、どちらも参照であるためです。仮パラメーターが参照するオブジェクトを変更すると、サブルーチンが戻った後、プログラムは実際のパラメーターを通じてそれらの変更を確認できます。

また、呼び出し中にオブジェクトの値を変更できるため、参照渡しに似ていますが、オブジェクトへの参照がコピーされているため、参照渡しとは異なります。変更されます。したがって、元の参照変数は、call-by-sharing を使用する「スワップ」ルーチンの後でも、同じオブジェクトを参照します。

于 2014-07-10T14:24:24.413 に答える