JavaRush /Java Blog /Random-JA /Javaでパラメータを渡す
vincent_vega
レベル 24
Gainesville

Javaでパラメータを渡す

Random-JA グループに公開済み
Java の変数は、値が入ったコンテナです。では、変数を「渡す」とはどういう意味でしょうか? また、プリミティブ データ型と参照データ型の違いは何ですか。
Java でパラメータを渡す - 1
それについては後で説明します。まずは簡単な課題から始めましょう。このコードが行うこと:
int х = 3;
int у = х;
1 行目では、 int 型の変数xが作成され、値 3 が割り当てられます。 2 行目では、 int 型の変数yが作成され、変数xの値が割り当てられます。将来的には、変数xはyにいかなる影響も与えなくなります。Java はx (3)の値をコピーし、コピーした値をyに配置します。これはパラメータを値で渡します。ある変数を別の変数に書き込むことはありません。値がコピーされ、新しい変数に割り当てられます。式y = x; 「 xをyに書き込む」という意味ではありません。これは、「 x内の値をコピーし、そのコピーをyに書き込む」ことを意味します。後でyを変更すると、次のようになります。
у = 34;
これはxに影響しますか? もちろん違います。xの値はまだ 3 です。後でxを変更すると、次のようになります。
х = 90;
これはyにどのような影響を与えるでしょうか? とんでもない。割り当てが行われた後 (値をコピーした後)、これらはまったく関係ありません。 参照型についてはどうですか? それらはどのように機能するのでしょうか? それほど難しいことではありません。実際、ルールは同じです。リンクも同じことを行い、リンクのコピーを取得します。それで私がこう言ったら:
Cat A = new Cat ();
Cat B = A;
リンクAがリンクBにコピーされます。これはオブジェクトには当てはまりません。オブジェクトはまだ 1 つだけです。しかし、現在では、同じCatオブジェクトを制御する 2 つの異なる参照が存在します。 次に、メソッドにパラメータを渡す方法を見てみましょう。 Java はパラメータを値で渡します。いつも。 これは、「値をコピーして、そのコピーを渡す」ことを意味します。プリミティブ型の場合は簡単です。
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
doStuff メソッドは次のようになります。
void doStuff (int у) {

   / / Действия с 'y'
}
x の値のコピー、つまり 5 がdoStuff()メソッドに渡されます。doStuff()メソッドには、 yという独自の変数があります。y変数は、新しい別の変数です。メソッドに渡した時点でxにあったもののコピー。これ以降、yx は相互に影響を及ぼしません。yを変更しても、 xには影響しません。
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
逆も同様です - xを変更してもyは変更されません。この場合、 xが行ったことは、値をコピーしてdoStuff()メソッドに渡すことだけです。 「値渡し」は参照でどのように機能しますか? 「Java はプリミティブ型を値で渡し、オブジェクトを参照で渡す」と言う人が多すぎます。それは彼らが言うことではありません。Java はすべてを値で渡します。プリミティブを使用すると、コンテンツのコピーが取得されます。リンクを使用すると、コンテンツのコピーも入手できます。しかし、リンクの内容は何でしょうか?リモコン。施設を管理・アクセスするための設備です。オブジェクトへの参照をメソッドに渡すときは、参照のコピーを渡すことになります。リモコンのクローン。オブジェクトはまだ作成された場所の山の中にあり、誰かがリモコンを使用するのを待っています。施設は、それを制御するために「プログラム」されたリモコンの数を気にしません。このことを気にするのは、ガベージ コレクターとプログラマーであるあなただけです。したがって、次のように言うと、
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Catオブジェクト は 1 つだけです。しかし、2 つのリモート コントロール (リンク) が同じCatオブジェクトにアクセスできるようになりました。したがって、BがCatオブジェクトに対して行うことはすべて、 Aが指すCatに影響しますが、 Aの内容には影響しません。新しいリンクB ( Aから直接コピー)を使用してCatを変更できますが、Aを変更することはできません。それは一体どういう意味ですか?Aが参照するオブジェクトを変更することはできますが、A の参照を変更することはできません(別のオブジェクトまたはnullにリダイレクトします)。したがって、 Bの参照( Bが参照する実際のCatオブジェクトではなく、参照自体の値) を変更しても、 Aの値は変更されません。およびその逆。それで:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
これは単にB が別のオブジェクトを指していることを意味します。Aさんは今でも幸せです。したがって、私の後に繰り返します。Java はすべてを値で渡します。 (わかりました、もう一度... 気持ちを込めて。) Java はすべてを値で渡します。 プリミティブ型の場合は現在の値のコピーを渡し、オブジェクト参照の場合は参照 (リモート コントロール) のコピーを渡します。オブジェクトを渡すことはありません。すべてのオブジェクトはヒープに保存されます。いつも。さあ、たっぷりのコーヒーを淹れて、コードを書いてみましょう。 原著
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION