ホームページ >Java >&#&チュートリアル >Java はオブジェクトの受け渡しをどのように処理しますか: 値または参照によって?

Java はオブジェクトの受け渡しをどのように処理しますか: 値または参照によって?

DDD
DDDオリジナル
2024-11-11 03:18:02842ブラウズ

How Does Java Handle Passing Objects: By Value or by Reference?

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; }
   }
}

これを実行する場合コード:

  • Foo f = new Foo("f");属性として「f」を持つオブジェクトを作成します。
  • changeReference(f); Foo オブジェクトの新しいコピーを作成し、その属性として "b" を割り当てますが、 f.
  • modifyReference(f); によって参照される元のオブジェクトには影響しません。 f が指しているオブジェクトを変更し、その属性を "c" に変更します。

結論

Java では、オブジェクトは値によって渡されます。つまり、オブジェクトのコピーが引数として渡されます。メソッド内でコピーに加えられた変更は、元のオブジェクトには影響しません。ただし、メソッドがオブジェクト自体を変更した場合 (属性を変更するなど)、元のオブジェクトは影響を受けます。 Java でオブジェクトを操作する場合、潜在的な混乱を避けるためにこの概念を理解することが重要です。

以上がJava はオブジェクトの受け渡しをどのように処理しますか: 値または参照によって?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。