ホームページ >Java >&#&チュートリアル >Java は値または参照によってオブジェクトを渡しますか?
Java では、オブジェクト受け渡しメカニズムに関して誤解が生じることがよくあります。この記事では、2 つのコード スニペットの区別を詳しく掘り下げ、Java のパラメータ受け渡し動作の基本原則に光を当てます。
コード 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 は値渡しではなく値渡しを利用します。参考までに。これは、オブジェクトが引数として渡されると、元のオブジェクトへの直接参照ではなく、その参照のコピーが作成されることを意味します。
最初の行では、myFoo は次のようになります。宣言されていますが、割り当てられていません。 2 行目は createFoo メソッドを呼び出し、myFoo に割り当てられる新しい Foo オブジェクトを返します。この割り当てにより、メソッド内で作成されたオブジェクトとは異なる新しいオブジェクトが作成されます。
対照的に、コード B は、引数として myFoo 参照を createFoo メソッドに渡します。メソッド内で、新しい Foo オブジェクトが作成され、foo パラメーターに割り当てられます。続いて、メソッド内のローカル変数である a に foo が代入されます。この再割り当てにより、元の参照 myFoo ではなく、ローカル参照 foo が効果的に変更されます。
概念を説明するために、次のクラスを考えてみましょう:
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 サイトの他の関連記事を参照してください。