web-dev-qa-db-ja.com

Java参照渡し

この2つのコードの違いは何ですか:

コード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;
}

これらの2つのコードに違いはありますか?

30
delita

Javaは常に引数を参照ではなく値で渡します。


これを で説明します。

_public class Main
{
     public static void main(String[] args)
     {
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a)
     {
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c)
     {
          c.setAttribute("c");
     }
}
_

これを次の手順で説明します。

  1. タイプfFooという名前の参照を宣言し、属性_"f"_を持つタイプFooの新しいオブジェクトに割り当てます。

    _Foo f = new Foo("f");
    _

    enter image description here

  2. メソッド側から、Fooという名前のa型の参照が宣言され、最初にnullに割り当てられます。

    _public static void changeReference(Foo a)
    _

    enter image description here

  3. メソッドchangeReferenceを呼び出すと、参照aが引数として渡されるオブジェクトに割り当てられます。

    _changeReference(f);
    _

    enter image description here

  4. タイプbFooという名前の参照を宣言し、属性_"b"_を持つタイプFooの新しいオブジェクトに割り当てます。

    _Foo b = new Foo("b");
    _

    enter image description here

  5. _a = b_は、属性が_"b"_であるオブジェクトに参照a NOT fを再割り当てしています。

    enter image description here


  6. modifyReference(Foo c)メソッドを呼び出すと、参照cが作成され、属性_"f"_でオブジェクトに割り当てられます。

    enter image description here

  7. c.setAttribute("c");は、cが参照するオブジェクトの属性を変更し、fが参照するオブジェクトと同じオブジェクトを変更します。

    enter image description here

Java :)でオブジェクトを引数として渡す方法が理解できたと思います

186
Eng.Fouad

Javaは厳密に「値渡し」であり、オブジェクトへの参照でさえ値渡しされるため、2番目のコードは期待どおりに動作しません。多数これに関する議論。

9
A.H.

メソッドのパラメーターを独自の変数宣言と考えてください。メソッド呼び出しを単一のコードブロックで置き換える場合、次のようになります。

Foo myFoo;
{                      //Method call starts here
    Foo foo;
    foo = myFoo;
    Foo f = new Foo();
    foo = f;
}                      //Method call ends here

メソッドパラメーターが別の変数と同じ名前を持っている場合でも、メソッドパラメーターは、メソッドのみが知っている独自の一意の参照です。これは、Eng.Fouadが上記で述べたのと同じことです。

2
Mutant Platypus

知っておくべきもう1つの重要なポイントは、メソッドに渡すオブジェクトタイプです。可変オブジェクトか不変オブジェクトか。 Stringなどの不変オブジェクトを渡すと、別のコピーが作成され、変更が行われます。変更は元のコピーには反映されません。

1
Eshan Sudharaka