Java は参照ではなく値によって返されることを知っているので、オブジェクトのコピーを作成し、新しいコピーを渡します。これは return ステートメントにも当てはまりますか? は
return obj;
新しいオブジェクトのコピーを作成するか、単に現在のオブジェクト自体を返します。
いいえ、これは間違った仮定です。Java がすべてを値渡しするのは事実ですが、これは次のことを意味します。
スカラー変数には値が含まれているため、値渡しであることが簡単にわかります。
一方、オブジェクト変数にはオブジェクトは含まれません。オブジェクトへの疑似アドレスが含まれていると考えることができます。その疑似アドレスは (値によって) コピーされますが、依然として同じオブジェクトを指しています。(オブジェクトは、実際にはnew
エクスプレッションのみを使用して作成されます。)
上記は、割り当て、引数、および戻り値について(両方のタイプの変数に対して)当てはまります。
so it makes a copy of the object and passes the new copy
いいえ!そうではありません!
obj
値による戻りとは、参照の値が返されることを意味しobj
ます。オブジェクトを指している場合、この戻りメソッドから戻り値を収集する他の参照も、指しているオブジェクトと同じオブジェクトをobj
指します。
いいえ、別のオブジェクトを作成して返すことはありません。
現在のオブジェクト自体を返すだけです。
あなたの言うことは、そのようなC++
ことをすることのようなものです。オブジェクト (非基本型) を返すときは、参照を返し、新しいオブジェクトを作成したり、コピーを実行したりしません。
Java では、原子型 (char、int、long など) は値によって返されます。オブジェクトは常に参照によって返されます (複製なし)。
return obj;
新しいオブジェクトを作成すると、現在のオブジェクト自体がコピーまたは返されますか?
-->obj
は、ヒープ上の実際のオブジェクトを指すオブジェクト参照です。return を割り当てているメソッドで、新しいオブジェクト参照 (作成者による) が作成されますobj
。
Object method() {
//....
return obj;
}
void methodA() {
Object objA = method(); // obj and objA are different because of their scopes but values are same(assigned to objA). That's why both points to the same Object on heap
}
Javaはオブジェクトをコピーせず、オブジェクト参照をメソッドに渡し、使用時にそれを返しますreturn
値をコピーするのは、int
、char
またはdouble