重複の可能性:
Java は「参照渡し」ですか?
多分私は何かが欠けている...しかし、Javaが値渡しと参照渡しの両方を使用する理由を本当に理解できません。なぜ1つのパラダイムだけを使用しないのですか?
重複の可能性:
Java は「参照渡し」ですか?
多分私は何かが欠けている...しかし、Javaが値渡しと参照渡しの両方を使用する理由を本当に理解できません。なぜ1つのパラダイムだけを使用しないのですか?
そうではありません。Java は純粋に値渡しです。オブジェクトを扱うときに渡される値はオブジェクト参照ですが、それは「参照渡し」とは関係ありません。
参照渡しとは、関数に変数を渡して、呼び出し元の関数でその変数の内容を変更できることを意味します。それはJavaには存在しません。
たとえば、次のようになります。
void foo() {
int a;
a = 42;
bar(a);
System.out.println(a); // Will ALWAYS be 42
}
void bar(int b) {
b = 67;
}
参照渡しがある C++ とは対照的です。
// C++ code
void foo() {
int a;
a = 42;
bar(a);
cout << a; // 67?!
}
void bar(int& a) { // <== Note the &
a = 67;
}
&
Java には、C++ の (またはC# のout
/に相当する) はありません。ref
おそらく、参照渡しの「参照」とはまったく別の「参照」という言葉の使用法であるオブジェクト参照について考えているでしょう。オブジェクトの例を見てみましょう:
void foo() {
Object o1, o2;
o1 = new Object();
o2 = o1;
bar(o1);
System.out.println(o1 == o2); // Will ALWAYS be true
}
void bar(Object o) {
o = new Object();
}
Java に参照渡しがある場合 (そして、オブジェクト変数を に渡すためにそれを使用した場合bar
)、==
infoo
は false になります。しかし、そうではなく、そうする方法はありません。
オブジェクト参照を使用すると、関数に渡されたオブジェクトの状態を変更できますが、呼び出し元の関数に含まれている変数を変更することはできません。
Java は常に「値渡し」です。したがって、プリミティブとオブジェクト(参照)の両方が値渡しされます。
編集
ええ、オブジェクトは直接渡されません。常に参照で参照します。したがって、オブジェクトの参照は値渡しされます。