JAvaにおける関数パラメータの理解

4883 ワード


Javaデータ型は基本データ型(8個)と参照データ型(クラス,インタフェース,配列)に分けられ,基本データ型はスタック上で申請され,参照データ型はスタック上で参照を申請し,スタック上でエンティティを申請するのでスタック上に格納されているのはスタック上のエンティティのアドレスであると考えられる.
 
Javaでの関数パラメータの伝達過程に戸惑う人も少なくありませんが、実用的な一言で言えば「関数のパラメータ伝達はすべて実参のコピー」ということです.これはC言語と同じですが、具体的に使うと異なる場合に効果があります.次に3つの状況に分けて議論し,いずれもよく見られるswapという例で分析した.
1は、基本的なデータ型です.
 1 public static void main(String[] args){
2 int x =100,y=200;
3 SOP.sop(x+"----"+y);
4 swap1(x, y);
5 SOP.sop(x+"----"+y);
6
7 }
8
9 static void swap1(int a ,int b){
10 int i = a;
11 a = b;
12 b = i;
13 }

ここでは,入力されたパラメータを交換する操作を行ったが,入力されたのは実際のパラメータのコピーであるため,元のパラメータに影響を及ぼすことはなく,交換の効果は得られない.
 
2は、参照タイプが入力され、関数内で値自体が変更されます.
 1 public static void main(String[] args){
2 String x = new String("100");
3 String y = new String("200");
4 SOP.sop(x+"----"+y);
5 swap1(x, y);
6 SOP.sop(x+"----"+y);
7
8
9 }
10
11 static void swap1(String a ,String b){
12 a = a.replace('1','2');
13 b = b.replace('2','1');
14
15 }

ここでは多くの人が間違える可能性があり、交換が実現すると考えていますが、さっきのルールで分析すると、引用のコピーが伝わってきましたが、ここにはちょうどstringの罠があります.それはstring自体は変わらないということです.stringを置き換えた後、実は新しいstringを返しました.次にswap関数の参照は、返された新しいstringを指し、参照が参照を変更したオブジェクトでもあります(参照オブジェクトの値が変更されたのではなく、参照オブジェクトが変更されたことに注意してください).
 
3は、参照タイプが入力され、関数内でオブジェクトを指す値が変更されます.
 1 public static void main(String[] args){
2 StringBuffer x = new StringBuffer("100");
3 StringBuffer y = new StringBuffer("200");
4 SOP.sop(x+"----"+y);
5 swap1(x, y);
6 SOP.sop(x+"----"+y);
7
8
9 }
10
11 static void swap1(StringBuffer a ,StringBuffer b){
12 a.replace(0, 1, "2");
13 b.replace(0, 1, "1");
14
15 }

同様に、この例では、パラメータが入力されるのは実パラメータのコピーであるが、stringbufferの特性は、操作後に返されるのは新しいオブジェクトではなく、自身であるため、ここでは参照されるオブジェクトを変更した値と考えることができる.したがって、コピーと実パラメータが同じオブジェクトを指し、コピーが指す値が変化した以上、実パラメータが指す値は当然変化します.