Javaではメソッドの引数は値渡しされる

C#ではメソッドの引数は値渡しされますが、Javaも一緒だよなと思い調べてみました。

まずは、エンティティとなるクラスです。

   1: package sample;

<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum2">   2:</span>&#160; </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum3">   3:</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> Book {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum4">   4:</span>     <span style="color:#0000ff;">private</span> String title;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum5">   5:</span>     <span style="color:#0000ff;">private</span> String author;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum6">   6:</span>     <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum7">   7:</span> <span style="color:#008000;">     * @param title セットする title</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum8">   8:</span> <span style="color:#008000;">     */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum9">   9:</span>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span> setTitle(String title) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum10">  10:</span>         <span style="color:#0000ff;">this</span>.title = title;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum11">  11:</span>     }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum12">  12:</span>     <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum13">  13:</span> <span style="color:#008000;">     * @return title</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum14">  14:</span> <span style="color:#008000;">     */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum15">  15:</span>     <span style="color:#0000ff;">public</span> String getTitle() {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum16">  16:</span>         <span style="color:#0000ff;">return</span> title;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum17">  17:</span>     }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum18">  18:</span>     <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum19">  19:</span> <span style="color:#008000;">     * @param author セットする author</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum20">  20:</span> <span style="color:#008000;">     */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum21">  21:</span>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span> setAuthor(String author) {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum22">  22:</span>         <span style="color:#0000ff;">this</span>.author = author;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum23">  23:</span>     }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum24">  24:</span>     <span style="color:#008000;">/**</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum25">  25:</span> <span style="color:#008000;">     * @return author</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum26">  26:</span> <span style="color:#008000;">     */</span></pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum27">  27:</span>     <span style="color:#0000ff;">public</span> String getAuthor() {</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum28">  28:</span>         <span style="color:#0000ff;">return</span> author;</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum29">  29:</span>     }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum30">  30:</span>&#160; </pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum31">  31:</span>     @Override</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum32">  32:</span>     <span style="color:#0000ff;">public</span> String toString(){</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum33">  33:</span>         <span style="color:#0000ff;">return</span> <span style="color:#006080;">&quot;Title:&quot;</span> + <span style="color:#0000ff;">this</span>.getTitle() + <span style="color:#006080;">&quot;/Author:&quot;</span> + <span style="color:#0000ff;">this</span>.getAuthor();</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum34">  34:</span>     }</pre>
<pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&#039;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;margin:0;padding:0;"><span style="color:#606060;" id="lnum35">  35:</span> }</pre>

ありがちですが、Bookクラスにタイトル(Title)と著者(Author)をセッター/ゲッターとして作成します。

次に、メインメソッドです。
 
   1: package sample;
   2:  
   3: public class RefMethod {
   4:  
   5:     /**
   6:      * @param args
   7:      */
   8:     public static void main(String[] args) {
   9:  
  10:         int num = 10;
  11:  
  12:         System.out.println("Before ModifyNum:num=" + num);
  13:  
  14:         ModifyNum(num);
  15:  
  16:         System.out.println("After ModifyNum:num=" + num);
  17:  
  18:         Book book = new Book();
  19:         book.setTitle("桃太郎");
  20:         book.setAuthor("不明");
  21:  
  22:         System.out.println("Before ModifyBook:" + book.toString());
  23:  
  24:         ModifyBook(book);
  25:  
  26:         System.out.println("After ModifyBook:" + book.toString());
  27:  
  28:         // bookインスタンスをNullにセットする
  29:         SetBookToNull(book);
  30:  
  31:         System.out.println("After SetBookToNull is book null?:" + (book == null));
  32:         System.out.println("After SetBookToNull:" + book.toString());
  33:     }
  34:  
  35:     private static void SetBookToNull(Book book) {
  36:         // 引数をNullへ変更する
  37:         book = null;
  38:         System.out.println("In SetBookToNull is book null?:" + (book == null));
  39:     }
  40:  
  41:     private static void ModifyNum(int num) {
  42:  
  43:         // 引数の値を999へ変更する
  44:         num = 999;
  45:         System.out.println("In ModifyNum: num=" + num);
  46:     }
  47:  
  48:     private static void ModifyBook(Book book) {
  49:  
  50:         // 引数のタイトルを変更する
  51:         book.setTitle("かちかちやま");
  52:         System.out.println("In ModifyBook:" + book.toString());
  53:     }
  54: }
  55:  

プリミティブ型、オブジェクトのインスタンス、インスタンスをNullにセットした場合とテストをしてみました。処理結果は以下の通りとなります。

   1: Before ModifyNum:num=10
   2: In ModifyNum: num=999
   3: After ModifyNum:num=10
   4: Before ModifyBook:Title:桃太郎/Author:不明
   5: In ModifyBook:Title:かちかちやま/Author:不明
   6: After ModifyBook:Title:かちかちやま/Author:不明
   7: Before SetBookToNull is book null?:false
   8: In SetBookToNull is book null?:true
   9: After SetBookToNull is book null?:false
  10: After SetBookToNull:Title:かちかちやま/Author:不明
 
結論から言うとC#と同じですね。基本的にメソッドの引数は値渡しです。順番に見ていきましょう。

プリミティブ型の場合

処理結果の1から3に該当しますが、ModifyNumメソッドの引数は、メソッド内で変更しても呼び出し元のメインメソッドでは変更されていません。まさに値渡しです。

オブジェクトインスタンスの場合

こちらは処理結果の7から9から見ていきましょう。7から10では、プリミティブ型の場合と同様の結果となっています。

つまり、nullでないbookクラスのインスタンス(処理結果の7行目)をSetBookNullメソッドへ引数として渡し、SetBookNullメソッド内で引数bookをNullにセットする。そうすると、引数bookはNullになります。(処理結果の8行目)

一方呼び出し元のメソッドでは、引数として渡したBookクラスのインスタンスはNullではありません。(処理結果の9行目)

これはまさにプリミティブ型と同様の結果です。

一方、メソッドへ渡した引数の属性であるセッター/ゲッターの場合はどうかというと少し異なります。こちらが処理結果の4行目から6行目です。

結論から言うと、メソッド内で変更した内容は呼び出しもとにおいても反映されることになります

これはどういうことかというと、メソッドの引数は値渡しだけれども、オブジェクトのインスタンスを引数とするときはあくまでインスタンスの参照先を値渡しするため、参照先のセッター/ゲッターへの変更は反映されることになります。

image

 

言語使用的な内容については、プログラミング言語Javaが詳しいです。
今回の内容も 2.6.5 パラメータの値 を参考にしました。