引数に配列やクラスオブジェクトを渡す
メソッドに渡す値が基本データ型であった場合には、値がコピーされて値そのものが引数に代入されます。考え方としては基本データ型の値を他の変数に代入する場合と同じです。
public static void main(String args[]){
test(10);
}
private static void test(int num){
System.out.println(num);
}
基本データ型だけではなくクラスから作成したオブジェクトや配列もメソッドに渡すことができます。
「参照型の変数の考え方」などでも記載したとおり、配列などは実際の値などが格納する場所の位置だけを管理しています。その為、メソッドを呼び出す時に配列を指定した場合には、引数には配列が確保している場所の位置が代入されることになります。つまりメソッドの呼び出し側の配列とメソッド側で引数に代入された配列はまったく同じ場所の位置を管理していることになります。
public static void main(String args[]){
int num[] = {10, 4};
test(num);
}
private static void test(int num[]){
System.out.println(num[0]);
System.out.println(num[1]);
}
よってメソッド側で配列の要素に格納されている値を変更すると、メソッド呼び出し側の配列の同じ要素に格納されている値を変更されることになります。
public static void main(String args[]){
int num = 8;
int array[] = {10, 4};
System.out.println(num);
System.out.println(array[0]);
test(num, array);
System.out.println(num);
System.out.println(array[0]);
}
private static void test(int num, int array[]){
num = 5;
array[0] = 12;
}
上記の場合、基本データ型の変数である「num」は値がコピーされて引数に代入されるだけなので、メソッド側で変数の値を変更しても呼び出し元の変数の値には何も影響しません。それに対して配列変数の「array」は配列の場所の位置が引数に代入されるので、メソッド側で配列の要素の値を変更すると呼び出し元の配列の要素の値も変更されます。(実際の結果は後のサンプルでご確認下さい)。
Stringクラスのオブジェクトの場合
文字列を引数に渡す場合、文字列はStringクラスのオブジェクトですので配列と同じようにオブジェクトの位置だけが渡されますが、あまり意識することなく基本データ型のように扱うことができます。次の例を見てください。
public static void main(String args[]){
String str = "abc";
test(str);
}
private static void test(String str){
str = "def";
}
Stringクラスのオブジェクトをメソッドに渡した場合、メソッド側の引数には同じオブジェクトの位置が渡されるのは配列と同じですが、文字列変数に新しい文字列を代入するとまったく別の場所にオブジェクトが新しく作成され、その新しい場所の位置がメソッド内の変数に代入されます。その為、元の場所には元の文字列が格納されたままなのでメソッド呼び出し元の文字列には何も影響を与えません。
サンプル
では簡単な例で試しておきます。
class JSample4_1{
public static void main(String args[]){
int num = 8;
int array[] = {10, 4};
System.out.println("num = " + num);
System.out.println("array[0] = " + array[0]);
henkou(num, array);
System.out.println("num = " + num);
System.out.println("array[0] = " + array[0]);
}
private static void henkou(int num, int array[]){
num = 5;
array[0] = 12;
}
}
コンパイル後に実行すると次のように表示されます。
メソッド側で配列の要素を変更すると、呼び出し元の配列にも影響が出ていることが確認できます。
( Written by Tatsuo Ikura )
JavaDrive