Javaの値渡しと参照渡しの使用方法について現役エンジニアが解説【初心者向け】
初心者向けにJavaの値渡しと参照渡しについて解説しています。最初に引数とプリミティブ型、参照型の基本を説明します。値渡しと参照渡しの違いをサンプルコードで確認しましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Javaの値渡しと参照渡しについて、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
Javaについてそもそもよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まるでしょう。
なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

今回は、Javaに関する内容だね!

どういう内容でしょうか?

値渡しと参照渡しについて詳しく説明していくね!

お願いします!
目次
引数とは
引数とはメソッドを呼び出す際にメソッドの内部の処理で使う値を渡す方法のことです。
引数はメソッド名の後ろの()の中に設定します。
引数の渡し方には、引数の種類によって値渡しと参照渡しの2種類の渡し方が存在増します。
[PR] Javaプログラミングで挫折しない学習方法を動画で公開中
値(プリミティブ)型とは
値型とは、Javaでデータを扱う型の一つでメモリ領域に決められた分のサイズをあけることで情報の保持が可能です。
値型はJavaには以下の8種類存在します
- byte型(8ビット)
- short型(16ビット)
- int型(32ビット)
- long型(64ビット)
- float型(32ビット)
- double型(64ビット)
- char型(16ビット)
- boolean型(1ビット)
例えばbyte型の場合だとメモリ領域に8ビット分領域を確保することができます。
参照型とは
参照型はデータが格納されているメモリ上の参照(アドレス)のコピーを保持している型です。
値型に含まれなかったものはすべて参照型に含まれます。
実は私も!?独学で損する人の特徴
「スクールは高いから独学で成功する」という気持ちの方は多いと思います。
もちろんその方が金額は低く抑えられるでしょう。
ただ
独学には向き不向きがあり、実はスクールが向いている人も大勢います。
そんな方のために参考として、
テックアカデミー卒業生がスクールを選んだ理由
をご紹介します。
- ・困って挫折しそうなときに、質問や相談できる相手がいる環境で学んでいきたいなと思った
- ・わかった気になっているだけだったので、自分を追い込む環境に置いた方がいいと感じた
- ・スクールのカリキュラムで市場に求められるスキルを学ぶべきと思った

少しでも当てはまる部分があれば、
スクールが向いているかもしれません。
お試しのつもりで、まずは一度
無料相談
に参加してみませんか?
現役エンジニア・デザイナーに何でも気軽に相談できる30分
を
すべて無料で
できます。
無理な勧誘は一切ない
ので、お気軽にご参加ください。
値渡しと参照渡しの違い
値渡しと参照渡しの違いは 渡した変数の状態が変化するかという点です。
実際に以下のソースを見ながら確認しましょう。
プログラムソースコード
public static void main(String[] args) { int num = 10; test(num); System.out.println(num); } public static void test(int num) { num += 10; System.out.println(num); }
実行結果
20
10
上記は値渡しを使ったサンプルコードです。
値型のint型の変数numに10を代入しました。
次にtestメソッドの中に値渡しで変数numを渡しています。
testメソッドの中では値渡しで受け取った引数にプラス10をしています。
結果、testメソッド内での出力は「20」と表示されるでしょう。
しかし、元のmainメソッドの出力は「10」のままです。
値渡しとは変数に格納されているデータの中身のみ渡して、その変数自体は書き換わらないことを意味します。
プログラムソースコード
public static void main(String[] args) { String[] array = {"おはようございます", "こんにちは", "こんばんは"}; test(array); System.out.println(array[0]); } public static void test(String[] array) { array[0] = "Hello"; System.out.println(array[0]); }
実行結果
Hello
Hello
今回は、参照型であるString[]の変数arrayをtestメソッドに渡しています。
testメソッドは中でString[]の0番目の要素を書き換えており、結果としてtestメソッドで出力し、String[]の0番目の値は書き換わった内容で出力されました。
そして、mainメソッドの方でも同じくString[]の0番目を出力すると同じく書き換わった内容が出力されています。
つまり、参照渡しで渡すと元の変数の内容も書き換わるということです。
Javaの参照渡し(参照の値渡し)について
通常参照渡しとはデータの場所、アドレスを渡すことで変数の内容自体を書き換えることを指します。
Javaの場合は参照渡しではなく参照の値渡しが可能です。
プログラムソースコード
public static void main(String[] args) { String[] array = {"おはようございます", "こんにちは", "こんばんは"}; test(array); System.out.println(array[0]); } public static void test(String[] array) { array = new String[3]; array[0] = "Hello"; System.out.println(array[0]); }
実行結果
Hello
おはようございます
先ほどの参照渡しと同じくString[]を渡しています。
しかし、testメソッド側で書き換えた内容がmain側では反映されていません。
これが参照の値渡しを意味します。
今回testメソッドのなかで引数に対して新たにString[]を初期化しました。
瞬間引数の参照する場所は引数としてわたっていたデータのアドレスではなく、新しく初期化したインスタンスが作られているアドレスを参照することになります。
しかし、mainメソッドの変数は参照するアドレスは変わりません。
元の変数と引数とで参照するアドレスが変わったことになり、これがJavaにおける参照渡しです。
執筆してくれたメンター
メンターSさん
システムエンジニアとしてこれまで行政システムや医療用システムの保守、開発に携わりました。 JavaやPython、PHP、Kotlinなど様々な言語での開発経験があります。 TechAcademyではJavaコース、Pythonコース、AIコースなど7コースを担当しています。 |

Javaの値渡しと参照渡しがよく分かったので良かったです!

ゆかりちゃん、分からないことがあったら質問してね!

分かりました。ありがとうございます!
TechAcademyでは、初心者でも、JavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプを開催しています。
また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。

プログラミングを独学していて、このように感じた経験はないでしょうか?
- ・調べてもほしい情報が見つからない
- ・独学のスキルが実際の業務で通用するのか不安
- ・目標への学習プランがわからず、迷子になりそう
テックアカデミーでは、このような
学習に不安を抱えている方へ、現役エンジニア講師とマンツーマンで相談できる機会を無料で提供
しています。
30分間、オンラインでどんなことでも質問し放題です。
「受けてよかった」と感じていただけるよう
厳しい試験を通過した講師
があなたの相談に真摯に向き合います。
「ただ気になることを相談したい」
「漠然としているがプロの話を聞いてみたい」
こんな気持ちでも大丈夫です。
無理な勧誘は一切ありません
ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)