#このチュートリアルの動作環境: Windows 10 システム、DELL G3 コンピューター。 Java は値で渡されますか?Java は値の受け渡しです。値の受け渡しとは、メソッドを呼び出すときに実際のパラメーターのコピーがメソッドに渡されるため、メソッド内でパラメーターが変更されても実際のパラメーターには影響しません。 ; 渡すとき 基本型が渡されると、値のコピーが渡され、コピーされた変数への変更は元の変数に影響しません。参照型が渡されると、参照アドレスのコピーが渡されますが、コピーされた変数はアドレスと実アドレスは両方とも同じ実データを指すため、元の変数の値を変更できます。
Java は値で渡されます。
基本型が渡される場合は、値のコピーが渡され、コピーされた変数への変更は元の変数には影響しません。参照型が渡される場合は、参照アドレスのコピーが渡されます。ただし、コピーされたアドレスと実アドレスは両方とも同じ実データを指しているため、String 型が渡されると、コピーされたアドレスも参照アドレスであり、参照アドレスを指しているにもかかわらず、元の変数の値を変更できます。同じデータ、文字列の値は変更できないため、元の変数の値は変更できません。 まず、参照渡しと値渡しについて説明しましょう。public void test() { int a = 1; change(a); System.out.println("a的值:" + a); } private void change(int a) { a = a + 1; } // 输出 a的值:1
public void test() { User user = new User(); user.setAge(18); change(user); System.out.println("年龄:" + user.getAge()); } private void change(User user) { user.setAge(19); } // 输出 年龄:19
呼び出し時change()メソッドは変数を渡す際にその変数もコピーしますが、ここでのコピーはスタック内の参照アドレスのみでヒープ内のデータはコピーしませんので、 のようになります。次の図:
変数はコピーされますが、変数が指すアドレスは同じであるため、変数内のデータが変更されると、元のデータに影響が残ります。ただし、スタック上の変数のアドレスを変更しても、元の変数には影響しません (たとえば、次のコード):
public void test() { User user = new User(); user.setAge(18); change(user); System.out.println("年龄:" + user.getAge()); } private void change(User user) { user = new User(); user.setAge(19); } // 输出 年龄:18
これは、スタック内の変数のアドレスを変更するためのものです。スタックされますが、元の変数には影響しません。
この時点では、誰もがほぼ理解していると思いますが、元の質問を振り返ると、String 型の変数が渡されています。String は参照型であり、元の変数が変更されるのは当然です。結果はどうですか? 変化はありませんか? String 変数は特別です。String のソース コードから、String の値は内部の char[] 配列によって維持されていることがわかりますが、このデータは最終型として定義されています。したがって、String の値はは不変です。通常、String の値を変更するときは、実際には新しい String オブジェクトを作成します。たとえば、次のコードでは:String a = "hello"; a = "world";
String は変数アドレスをコピーしますが、元の String の値を変更することはできません。String は不変であるため、change() メソッドで新しい String オブジェクトが作成されます。は新しいオブジェクトの値であり、元の変数は効果がありません。
さらに関連する知識については、FAQ 列をご覧ください。
以上がJavaは値渡しですか、それとも参照渡しですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。