参照型の引数に変数を設定した場合、メソッドに渡るのは値ではなく参照になります。
そのため、メソッド内で、参照の本体を書き換えると、メソッド呼び出し元の変数の本体も、同じ物を参照しているので書き換わります。
このように、メソッドに参照を渡すことを「参照渡し」と呼びます。
┏━━┓ ┏━━┓ ┏━━━━━━━━━┓ ┃変数┃──┃参照┃……→┃オブジェクト(本体)┃ ┗━━┛ ┗━━┛ ┗━━━━━━━━━┛ │ │ │ │参照を受け取る ↓ ┏メソッド━( 引数 )━┓ ┃ ┃ ┗━━━━━━━━━━┛
┏メソッド━( 引数 )━┓ ┃┏━━┓ ┏━━┓┃ 書き換え ┏書き換わった━━━┓ ┃┃引数┃──┃参照┃………………→┃オブジェクト(本体)┃ ┃┗━━┛ ┗━━┛┃ ┗━━━━━━━━━┛ ┗━━━━━━━━━━┛
あれ? ┏━━┓ ┏━━┓ ┏書き換わっている━┓ ┃変数┃──┃参照┃……→┃オブジェクト(本体)┃ ┗━━┛ ┗━━┛ ┗━━━━━━━━━┛
参照型の引数の挙動が分かるコードを以下に示します。メソッド内では、引数を利用して、オブジェクトの値(配列の中身)を書き換えています。
package sample; public class MyClass { public static void plusOneArray(int[] array) { for (int i = 0; i < array.length; i ++) { array[i] ++; // 各要素の値を1増やす } } }
package sample; import java.util.Arrays; public class Sample { public static void main(String[] args) { int[] array = {0, 1, 2}; // 配列をダンプ System.out.println(Arrays.toString(array)); // 全ての要素の値を1増やす MyClass.plusOneArray(array); // 配列をダンプ System.out.println(Arrays.toString(array)); } }
[0, 1, 2] [1, 2, 3]