この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つのコードに違いはありますか?
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");
}
}
_
これを次の手順で説明します。
タイプf
のFoo
という名前の参照を宣言し、属性_"f"
_を持つタイプFoo
の新しいオブジェクトに割り当てます。
_Foo f = new Foo("f");
_
メソッド側から、Foo
という名前のa
型の参照が宣言され、最初にnull
に割り当てられます。
_public static void changeReference(Foo a)
_
メソッドchangeReference
を呼び出すと、参照a
が引数として渡されるオブジェクトに割り当てられます。
_changeReference(f);
_
タイプb
のFoo
という名前の参照を宣言し、属性_"b"
_を持つタイプFoo
の新しいオブジェクトに割り当てます。
_Foo b = new Foo("b");
_
_a = b
_は、属性が_"b"
_であるオブジェクトに参照a
NOT f
を再割り当てしています。
modifyReference(Foo c)
メソッドを呼び出すと、参照c
が作成され、属性_"f"
_でオブジェクトに割り当てられます。
c.setAttribute("c");
は、c
が参照するオブジェクトの属性を変更し、f
が参照するオブジェクトと同じオブジェクトを変更します。
Java :)でオブジェクトを引数として渡す方法が理解できたと思います
Javaは厳密に「値渡し」であり、オブジェクトへの参照でさえ値渡しされるため、2番目のコードは期待どおりに動作しません。多数これに関する議論。
メソッドのパラメーターを独自の変数宣言と考えてください。メソッド呼び出しを単一のコードブロックで置き換える場合、次のようになります。
Foo myFoo;
{ //Method call starts here
Foo foo;
foo = myFoo;
Foo f = new Foo();
foo = f;
} //Method call ends here
メソッドパラメーターが別の変数と同じ名前を持っている場合でも、メソッドパラメーターは、メソッドのみが知っている独自の一意の参照です。これは、Eng.Fouadが上記で述べたのと同じことです。
知っておくべきもう1つの重要なポイントは、メソッドに渡すオブジェクトタイプです。可変オブジェクトか不変オブジェクトか。 Stringなどの不変オブジェクトを渡すと、別のコピーが作成され、変更が行われます。変更は元のコピーには反映されません。