Java の値渡しと参照: 違いの分析
Java では、引数は参照ではなく値によって渡されます。この概念は、特にオブジェクトを扱う場合に混乱を招く可能性があります。 2 つのコード スニペットの微妙な違いを調べてみましょう:
コード A:
Foo myFoo; myFoo = createfoo();
コード B:
Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; }
コードを理解するA
コード A では、参照変数 myFoo が作成され、createfoo() によって返されるオブジェクトに割り当てられます。ただし、Java では、オブジェクトは参照ではなく値によって渡されます。これは、オブジェクトのコピーが作成され、myFoo に割り当てられることを意味します。このコピーに加えられた変更は、createfoo() の元のオブジェクトには影響しません。
コード B について
コード B は、パラメーター foo を指定して createFoo() 関数を使用します。 。繰り返しますが、foo は元の参照変数 myFoo のコピーです。したがって、 f が作成されて foo に割り当てられると、実際には createFoo() 内の myFoo のコピーが置き換えられます。 createFoo() 内で foo に加えられた変更は、元の myFoo 参照変数に反映されます。
違いを説明する例
さらに明確にするために、次の例を考えてみましょう。 :
public class Main { public static void main(String[] args) { Foo f = new Foo("f"); changeReference(f); // Will not change the reference! modifyReference(f); // Will modify the object referred by "f"! } public static void changeReference(Foo a) { Foo b = new Foo("b"); a = b; // Re-assigns 'a' reference to the new object, not 'f'. } public static void modifyReference(Foo c) { c.setAttribute("c"); // Modifies the object referred by 'c', same as 'f'. } private static class Foo { private String attribute; public Foo(String attribute) { this.attribute = attribute; } public void setAttribute(String attribute) { this.attribute = attribute; } } }
これを実行する場合コード:
結論
Java では、オブジェクトは値によって渡されます。つまり、オブジェクトのコピーが引数として渡されます。メソッド内でコピーに加えられた変更は、元のオブジェクトには影響しません。ただし、メソッドがオブジェクト自体を変更した場合 (属性を変更するなど)、元のオブジェクトは影響を受けます。 Java でオブジェクトを操作する場合、潜在的な混乱を避けるためにこの概念を理解することが重要です。
以上がJava はオブジェクトの受け渡しをどのように処理しますか: 値または参照によって?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。