JavaもCも参照渡しを持っていません。これらは両方とも厳密に値渡しです。
参照渡しのセマンティクスは、メソッドのパラメーターの値を変更すると、呼び出し元が引数でその変更を確認することを意味します。
さて、あなたは考えているかもしれません:「しかし、それはJavaの場合です!メソッドの間にオブジェクトを変更すると、呼び出し元はその変更を見ることができます。」オブジェクトはパラメータではありません。パラメータは単なる変数であり、その変数の値を変更しても、呼び出し元には表示されません。例えば:
public void foo(Object x)
{
x = null;
}
public void caller()
{
Object y = new Object();
foo(y);
// y is still not null!
}
パラメータが実際に参照によって渡された場合、y
後でnullになります。代わりに、の値y
は単なる参照であり、その参照は値によって渡されます。「参照」という言葉は両方の用語であるため混乱しますが、それらは異なるものです。
C#がキーワードを使用する場合(および使用する場合のみ)のように、Javaに参照渡しのセマンティクスがあった場合に何が可能になるかを確認するには、C#パラメーターの受け渡しに関する私の記事を参照してください。ref
また、トピックに関連するStackOverflowの回答へのコメントもご覧ください。