はじめに
アドベントカレンダー12/8 = 8記事目になります
新たに参画したプロジェクトで Java を使い始めました。
そんな中、メソッドの「引数」の扱いがよく分からず混乱してしまいました。
「呼び出し元」「受け取り側」「値を渡す」という仕組みを調べてみると、なるほどと思うことが多く、今回はその調べたことを「同じように迷っている人向け」にまとめてみようと思います。
具体例
たとえば次のようなコードを見たとき…
void washApple(Apple apple) {
// りんごを洗うだけ
}
この関数が “赤いりんご” を洗うのか “青いりんご” を洗うのかは、この関数の中身では決まりません。
呼び出す側がどんな “りんご” を渡すかにより、洗われるりんごは変わります。
つまり、メソッドの中身が同じでも、「呼び出し元が渡す値しだい」で結果が変わる――この考え方が、Java における「引数を渡す」「受け取る」という構造の本質、というわけです。
「呼び出し元」「受け取り側」のイメージ — 日常の例
頼みごとの例
- あなた(呼び出し元) → 「りんごを 2 個買ってきて!」と友達に頼む。
-
友達(受け取り側) → 「了解、2個ね」と受け取り、買ってくる。
このとき、あなたが渡すのは「2」という 値 だけ。
友達の側では、その値を「個数」という名前で受け取り「2個ね」と理解します。
ポイントは―― - 「2個」という “値” を渡している(りんごそのものではない)
- 渡すのは “値だけ”
- “誰が・どんな値を渡すか” は 呼び出し元 によって変わる
つまり、“何を渡すか(値)” が呼び出し元の責任、メソッドは渡された値を受け取って処理するだけ という関係です。
Java のコード例で見る「値を渡す」と「受け取る」
// — 呼び出し元 —
int appleNumber = 2;
buyApples(appleNumber); // ← “2” を渡す
// — 受け取り側(メソッド) —
void buyApples(int count) {
System.out.println("リンゴを " + count + " 個買います");
}
- 呼び出し元は変数
appleNumberに「2」を入れ、それをbuyApples()に渡す。 - メソッド側では、受け取った値を
countという名前で受け取る(たとえ名前が違っても中身は「2」)。 - メソッド内ではその “2” を使って処理するだけ。
このように、変数名は呼び出し元と受け取り側で違っても構わない — “値” がそのまま渡されるので、名前は単なるラベルにすぎません。
ポイント
| 呼び出し元 | 受け取り側 | 中身の値 |
|---|---|---|
| appleNumber(変数名) | count(引数名) | 2 |
| tckCsdHisNo(変数名) | csdHisNo(引数名) | 同じ値が渡ってくる |
👉 名前は違っても、値はちゃんと渡される。名前は関係ない!
なぜ「変数名が違っても大丈夫」なのか?
- メソッド呼び出し時には、呼び出し元の変数そのものではなく、“値” のコピー が渡される。
- 受け取り側はそのコピーを別の名前で受け取るだけ — 元の変数には影響しない。
- だから、呼び出し元の変数名と、メソッド側のパラメータ名が異なっていても 問題ない。
たとえばこんなコードを書いても――
Long tckCsdHisNo = 0L;
createSupportedHistory(tckCsdHisNo);
private void createSupportedHistory(Long csdHisNo) {
// ここで csdHisNo を変更しても…
csdHisNo = 123L;
// 呼び出し元の tckCsdHisNo は影響を受けない
}
このように、受け取り側で csdHisNo を変えても、呼び出し元の tckCsdHisNo の値は変わらず 0 のまま ―― これは “値渡し” の典型例になります。
“値渡し” の仕組み(特に Pass by Value)について
- Java では、引数をメソッドに渡すとき、必ず「値(または参照値)のコピー」 が渡されます
- つまり、たとえオブジェクトを渡したとしても、「参照そのもの」が渡されるわけではなく、「参照のコピー」が渡される、という扱いになります
- このため、「メソッドの中でパラメータそのものを書き換えても呼び出し元の変数は変わらない」ことが保証されます
まとめ
- メソッド呼び出しでは、“呼び出し元” が“どの値を渡すか”を決める
- 受け取り側(メソッド定義)は、渡された値を“別の名前”で受け取るだけ
- 変数名が違っていても、値はちゃんと渡される
- そして、Java では引数は常に「値(または参照値)のコピー」として渡される ―― これが「値渡し(pass-by-value)」の基本
さいごに
特にはじめのころは、「変数名=意味」「メソッドの引数=元の変数そのもの」と思いがちですが、実際には “値だけ” が渡されている んだ、という考えを持てると少しわかりやすくなりました
この「呼び出し元/受け取り側」「値渡し」という関係をもっと深く理解できると、コードの振る舞いや不具合の原因がイメージしやすくなるかと思います。
今後も色んな事を少しずつ理解しながらアウトプットにつなげる事ができればと思います。
参考記事