Help us understand the problem. What is going on with this article?

【Java初心者】参照型を引数として渡したときの挙動

More than 1 year has passed since last update.

20190422追記
「参照渡し」への間違い部分に修正を入れています。
一部取り消し線で対応していますが、取り消し線での対応が難しい部分は大きく改変しています。(該当部分にはその旨を書いています)
追記ここまで

以前、【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)という記事を投稿したのですが、さらに詳しく知ることができたのでまとめます。

値渡しと参照の値渡し

メソッドの引数には、基本データ型も参照型も指定できます。しかし、どちらの型を使うかによって挙動がかわってきます。

基本データ型を指定した場合は値のコピーがメソッドに渡されます。値のコピーが渡されるので、メソッドの中で引数に対して行われた操作は、呼び出し元には影響しません。

参照型を指定した場合はその値の参照のコピーをメソッドに渡します。そのためメソッドの中で引数に対して行われた操作は、呼び出し元にも影響します。
ここまでが前回の記事の内容です(詳しくは【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)をどうぞ)。

参照の値渡し

基本的には上に書いたようなことなのですが、正確にいうと少し違うというか、誤解を与えてしまうかもしれません。
参照型の場合、参照情報を渡すので、メソッド内での操作は呼び出し元に影響を与えます。
このことを以下のサンプルで説明します。

参照の値渡し(参照のコピーを渡している)という部分を以下のサンプルで説明します。

まずはsample1です。

sample1
int[] array = {10,20,30};
System.out.println("呼び出し前:" + array[0]);
method(array);
System.out.println("呼び出し後:" + array[0]);

void method(int[] arrayInMethod){
     arrayInMethod[0] = 100;
} 

sample1の結果
呼び出し前:10
呼び出し後:100

続いて、sample2です。

sample2
int[] array = {10,20,30};
System.out.println("呼び出し前:" + array[0]);
method(array);
System.out.println("呼び出し後:" + array[0]);

void method(int[] arrayInMethod){
     int[] nums = {100,200,300};
     arrayInMethod= nums;
} 

sample2の結果
呼び出し前:10
呼び出し後:10

追記:以下、大幅に改変しました。
sample2では、method内でarrayInMethodに新しく生成した配列であるnumsを入れています。
この操作により、メソッド内のarrayInMethodの参照先がarrayからnumsにかわっています。
もともと、arrayInMethodにはarrayの参照先のコピーが入っていましたが、numsの参照先のコピーが入るようになっただけなので、arrayには影響を与えません。

一方、sample1では、メソッド内のarrayInMethodが参照している先の値を書き換えています。
そのため、呼び出し元の変数のarrayにも影響が出ます。
追記ここまで

まとめ

参照にかかわる部分はとても難しいと感じました。特にJavaをやり始めた段階、Javaが初めて勉強する言語の場合、にはなかなか理解するのが難しいなと。

今度は「参照型」についてまとめたいと思います。(一番初めに書けばよかったですね。。。)

chihiro
jrits
信頼と魅力のある先進のITをもとに、お客様のワークスタイル・イノベーションの実現を目指します。
http://www.jrits.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした