Javaメソッドパラメータ伝達の問題は、少し見どころがあります

4258 ワード

Javaでは,構造方法,関数,伝達パラメータが最も一般的であり,計算結果を持ち出し,伝達値を再付与し,変数付与値の更新を実現することを望んでいる場合がある.
1つの方法でパラメータ値を元の3倍に増やそうとすると、次のコードを書く可能性があります.

class PassValue 
{   //           ?------     
      public static void main(String[] args) 
     {
            int i = 10;
            callByValue(i);
            System.out.println(i);
      }   
     //          【   】    ;     
       static void callByValue(int n)
      {
             n = n*3;
      }
}

結果:10を返します.つまり、私たちのiは何の影響も受けていません.
その原理はi=10である.方法が実行されると、nはiの数値をコピーし、コピーn=10を形成する.n=n*3を実行します.後nの値は30になる.方法が終了すると、nは使用されなくなり、私たちの以前のiには何の影響もありません.
--------------------------------------------------------------------

class PassValue 
{   //           ?------     
      public static void main(String[] args) 
     {
            int i = 10;
            i=callByValue(i);//      ;
            System.out.println(i);
      }   
     //          【   】    ;     
       static int callByValue(int n)
      {
             n = n*3;
             return n;
      }
}

結果:30を返し、このサンプルコードでは、修正後のパラメータnの値を返すことで変数iに値を付与し、値伝達パラメータの値を強制的に修正し、パラメータ値を修正する目的を達成する.
--------------------------------------------------------------------
リファレンス伝達値と数値伝達の比較:

class PassValue 
{
      public static void main(String[] args) 
     {
          int i = 10;
          callByValue(i);
          System.out.println("    i :"+i);
	 System.out.println("-------------------------------------");


	 test person=new test(2);//   getmoney  2;
            System.out.println("   person getmoney:"+person.getmoney);
	  callByReference(person);
			 
           System.out.println("  callByReference(person)   person getmoney:"+person.getmoney);
           System.out.println("  person      person       !");


      }   
//          【   】    ;     
       static void callByValue(int n)
      {
		  
             n= n*3;
      }

//         【    】    
      static void callByReference(test i)
      {
            i.add(i.getmoney);
      }
}

class test //     test  ,   getmoney int  ,              3 ;
{      int getmoney;
	    public test(int n)
	    {
                 getmoney=n;
	     }
	    public void add(int a)
	    {
	        getmoney=a*3;
	    }

}

値呼び出し下i値:10
以前のpersonのgetmoney:2
callByReference(person)を使用した後のpersonのgetmoney:6
Personを代入する方法でpersonの値が変わりました!
--------------------------------------------------------------
上の段のプログラムは少し回りますが、実は簡単に見るとint i=10です.callByValue(i);後i値は変化しなかった.一方test person=new test(2);callByReference(person);その後personの値が変わった.
もっと簡単な説明をします.

class PassValue 
{
     public static void main(String[] args) 
     {
         int a = 10;
         int[] b = {1,2,3};
         test(a,b);
         System.out.println(a);
         System.out.println(b[0]);

     }        
     static void test(int n,int[] t)
     {
         n = 0;
         t[0] = 12345;
      }

}

出力結果:10 12345
同じように入力パラメータなのに、変数aの値が変更されず、b[0]の値が変更されたのはなぜですか.
パラメータ伝達には、一般的に2つのパラメータ伝達のルールが存在し、Java言語でもこの2つの方法があります.
l値で渡す(by value)
値転送とは、パラメータを転送するたびに、パラメータの元の数値を新しいものにコピーし、新しいコピーされた数値をメソッド内部に転送し、メソッド内部で修正すると、修正するとコピーされた値がコピーされ、元の値は変更されません.
説明:この方法で渡されるパラメータでは、パラメータの元の値は変更されません.
lアドホック転送(by address)
アドレス転送とは、パラメータを転送するたびに、パラメータのメモリ内の記憶アドレスをメソッド内部に転送し、メソッド内部で記憶アドレスによって対応する記憶領域の内容を変更することを意味する.メモリに固定されたアドレスの値は1つしかないため、メソッド内部でパラメータの値を変更すると、パラメータの元の値が変更されます.
説明:この方法で渡されるパラメータは、メソッド内部でパラメータの値を変更すると、パラメータの元の値も変更されます.
Java言語では、次のように、データ型が値別に伝達され、データ型がアドレス別に伝達されることをハードに規定しています.
l値別データ型:8種類の基本データ型とString
lアドホックデータ型:String以外のすべての複合データ型、配列、クラス、インタフェースを含む
文章が下手だから,みんなで間に合わせてみよう.