Java関数での値伝達の問題について

4025 ワード

最近プログラミングをしているときにツールクラスを書くことがよくあります.入力した値を修正したり、変数を返したりします.では、入力した値を変更する場合に返す必要があるという問題が発生しましたか?返さなければ修正の目的を達成できますか?ではJava関数の値伝達問題について説明します.Javaの関数呼び出し値について説明します.1、問題の起源問題はc言語に起源し、まず次のコードを見る.
#include 
//    
void change(int a,int b){
    int flag = a;
    b = a;
    a = flag;
}
//    
void change2(int *a,int *b){
    int flag = *a;
    *a = *b;
    *b = flag;
}
void main(){
    int a = 1;
    int b = 2;
    //    ,       a,b      
    change(a,b);//->a=1,b=2
    //    ,            ,       a,b      
    change2(&a,&b);//->a=2,a=1
}

このコードは、c言語のアドレス、値呼び出しです.ここで、伝達値呼び出しとは、伝達関数の変数が対応する値のみに伝達されることを意味し、すなわち、変数自体の内容が変化しない(すなわちchangeのa,bはmainのa,bと同じ変数ではない).アドレス呼び出しとは、サブ関数に入力されるのは変数のアドレス、すなわちサブ関数が変更されるのはアドレス上の内容(すなわちchange 2の*a、*bはmainのa,b)である.
2、Javaでの関数呼び出しはどの方式ですか.Javaにおける関数呼び出しは大きく3つに分類される:(1)8大基本タイプ(byte,short,int,long,float,double,char,boolean)8大基本タイプが運用する伝値呼び出しであり、例を見てみると:
public void change(int a,int b){
    int flag = a;
    a = b;
    b = flag;
}
public static void main(String args[]){
    int a = 1;
    int b = 2;
    change(a,b);//->a=1,b=2
}

(2)参照タイプ参照タイプが関数に入力されるのは参照であり,参照に格納されるのは記憶アドレス,すなわち変形後のアドレス呼び出しである.
public void change(StringBuffer a,StringBuffer b){
    StringBuffer flag = new StringBuffer(a);
    b = a;
    a = flag;
}
pubic static void main(String args[]){
    StringBuffer a = new StringBuffer("1");
    StringBuffer b = new StringBuffer("2");
    change(a,b);//->a="2",b="1"
}

(3)特殊なStringタイプはよく知られていますが、Stringタイプも参照タイプですが、(2)でいうアドレス呼び出しには適用されません.コードを見てください
public void change(String a,String b){
    String flag = a;
    b = a;
    a = flag;
}
pubic static void main(String args[]){
    String a = "1";
    String b = "2";
    change(a,b);//->a="1",b="2"
}

ブレークポイントは,サブ関数のa,bがmain関数のa,bとは異なり,Stringタイプが実際には伝値呼び出しであることがわかる.
3、結論Javaにおける基本タイププラスStringタイプはいずれも伝値呼び出しであり、残りの参照タイプは伝所呼び出しである.Java関数を使うときは変数が変わるかどうか気をつけてくださいね!