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

Java は値または参照によってオブジェクトを渡しますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-21 06:14:10455ブラウズ

Does Java Pass Objects by Value or Reference?

Java: 値渡しと参照渡し

Java では、オブジェクト受け渡しメカニズムに関して誤解が生じることがよくあります。この記事では、2 つのコード スニペットの区別を詳しく掘り下げ、Java のパラメータ受け渡し動作の基本原則に光を当てます。

コード A とコード B

コード A:

Foo myFoo;
myFoo = createfoo();

public Foo createFoo() {
   Foo foo = new Foo();
   return foo;
}

コード B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo) {
   Foo f = new Foo();
   foo = f;
}

Java のパラメータ渡しを理解する

一般的な考えに反して、Java は値渡しではなく値渡しを利用します。参考までに。これは、オブジェクトが引数として渡されると、元のオブジェクトへの直接参照ではなく、その参照のコピーが作成されることを意味します。

コード A 説明

最初の行では、myFoo は次のようになります。宣言されていますが、割り当てられていません。 2 行目は createFoo メソッドを呼び出し、myFoo に割り当てられる新しい Foo オブジェクトを返します。この割り当てにより、メソッド内で作成されたオブジェクトとは異なる新しいオブジェクトが作成されます。

コード B 説明

対照的に、コード B は、引数として myFoo 参照を createFoo メソッドに渡します。メソッド内で、新しい Foo オブジェクトが作成され、foo パラメーターに割り当てられます。続いて、メソッド内のローカル変数である a に foo が代入されます。この再割り当てにより、元の参照 myFoo ではなく、ローカル参照 foo が効果的に変更されます。

Clarity の例

概念を説明するために、次のクラスを考えてみましょう:

public class Foo {
   private String attribute;

   public void setAttribute(String attribute) {
      this.attribute = attribute;
   }
}

Main Class:

public class Main {
   public static void main(String[] args) {
      Foo f = new Foo("f");
      changeReference(f); // Attempt to change reference
      modifyReference(f); // Attempt to modify object attribute
   }

   public static void changeReference(Foo a) {
      Foo b = new Foo("b");
      a = b;
   }

   public static void modifyReference(Foo c) {
      c.setAttribute("c");
   }
}

main メソッドは、Foo のインスタンスを作成して f に割り当てた後、changeReference を呼び出し、参照を別のオブジェクトに再割り当てしようとします。ただし、これは f 参照を変更しません。

逆に、modifyReference は、f と同じオブジェクトである c によって参照されるオブジェクトの属性を変更します。これは、参照の受け渡しによってオブジェクト自体ではなく、参照のコピーが作成されることがわかります。

結論

Java の値による受け渡しアプローチは、元のオブジェクトをスコープ外の意図しない変更から保護することにより、オブジェクトの不変性を保証します。この原則によりカプセル化が促進され、堅牢で予測可能なコードの作成が容易になります。

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

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