配列の参照渡し

int[] arrayA={3,4,5};
int[] arrayB;
arrayB=arrayA;
arrayB[0]=10;
System.out.print(arrayA[0]);
配列変数にはアドレスが入っている。
配列変数にはアドレスが入っている。
配列変数にはアドレスが入っている。
arrayAにはアドレスが入っている。
arrayAにはアドレスが入っている。
arrayAにはアドレスが入っている。
[]を付けなければアドレスが入っている。
[]を付けなければアドレスが入っている。
[]を付けなければアドレスが入っている。

アドレスは数値(や文字など)を記憶してある場所を示すもの。
arrayB=arrayAはアドレスを代入している。
よってarrayAとarrayBは1つのアドレスを共有することになる。
[]を付けることでアドレスから数えて何番目の値を使うか指定できる。
アドレスが共通なのでarrayB[0]=10とするとarrayA[0]の内容も10になる。
つまり1つの配列を2つの変数から操作できる状態になる。

これを利用して配列変数を引数として参照渡しすればスコープ外でも配列の内容に干渉できる。
int[] arrayA={3,4,5};
System.out.println( total(arrayA) );   // arrayAのアドレスを引数にしてtotalメソッドを呼び出す
for(int num:arrayA)System.out.print(num+" ");   // arrayAの中身を書き出す
...
int total(int[] ar){   // arにはarrayAのアドレスが入りarrayAとして使うことができる
   int t=0;
   for(int i=0;i<ar.length;i++)ar[i]++;   // 配列に入ってる値を全部インクリメントする
   for(int num:ar)t+=num;       // 配列に入ってる値の合計を出す
   return t;
}
arrayAはtotalメソッド内でインクリメントされ最終的に中身は{4,5,6}となる

その他の参照渡し

文字列やインスタンスも同様に変数にはアドレスが入っているので参照渡しができる。