この記事では、Java パラメーターの値の受け渡しと参照の受け渡しについて説明します (例を示します)。必要な方は参考にしていただければ幸いです。
値の転送: メソッドが呼び出されるとき、実パラメータはその値を対応する仮パラメータに渡します。メソッドの実行中に仮パラメータ値が変更されても、実パラメータの値には影響しません。
参照渡し: アドレス渡しとも呼ばれます。メソッドが呼び出されるとき、実パラメータの参照 (パラメータの値ではなくアドレス) がメソッドの実行中に、対応する仮パラメータに渡されます。仮パラメータに対する操作は、実際には実パラメータに対する操作となります。メソッド実行時の仮パラメータ値の変更は、実際のパラメータ値に影響を与えます。
a. 値を渡すためのデータ型: 8 つの基本データ型と文字列 (これは理解できますが、実際には文字列も渡されるアドレスですが、文字列オブジェクトは他のオブジェクトとは異なり、文字列オブジェクトはコンテンツが変更されると、新しいオブジェクトが生成されます。その場合、StringBuffer は問題ありませんが、そのコンテンツのみを変更することはできません)。
b. アドレス値を渡すためのデータ型: 配列、クラス、インターフェイスを含む、文字列を除くすべての複合データ型。
値の転送の例:
package com.other.test; public class Test { public static void change(int i, int j) { int temp = i; i = j; j = temp; } public static void main(String[] args) { int a = 3; int b = 4; change(a, b); System.out.println("a=" + a); System.out.println("b=" + b); } }
出力結果は a=3 b=4 で、渡された値は元の値を変更しません
参照によって渡されます例: (配列)
package com.other.test; public class Test { public static void change(int[] counts) { counts[0] = 6; System.out.println(counts[0]); } public static void main(String[] args) { int[] count = { 1, 2, 3, 4, 5 }; change(count); System.out.println(count[0]); } }
出力結果は 6 6、つまり参照値が元の値から変更されました。 参照転送の例: (オブジェクト)
A オブジェクトを定義します。
package com.other.test; public class A { int i = 0; }
上記のオブジェクトを操作するクラス:
package com.other.test; public class Test { public static void add(A a) { //a = new A(); ① a.i++; } public static void main(String args[]) { A a = new A(); add(a); System.out.println(a.i ); } }
①にアノテーションが付けられている場合、出力結果は 1 になり、①にアノテーションが付けられていない場合、出力結果は 0 になります。理由は a =new A(); 新しい A オブジェクトが構築されるとき、それは渡されるオブジェクトではありません。 String の状況を見てください。
package com.other.test; public class Test { String str = new String("old"); char[] ch = { 'a', 'b', 'c' }; public static void main(String args[]) { Test ex = new Test(); ex.change(ex.str, ex.ch); System.out.print(ex.str + " and "); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = "new"; ch[0] = 'd'; } }
出力結果は古く、dbc、つまり String を渡すと元の値は変更されず、新しい値が作成されます。
ch[] は単純な配列転送です。 (オブジェクトにはオブジェクト参照、つまりオブジェクトのアドレスとコンテンツが含まれます) String コードを読んだことがある人なら誰でも、String が最終的なものであることがわかります。したがって、値は変わりません。関数内の String オブジェクト参照のコピーは別の新しい String オブジェクトを指しますが、配列オブジェクト参照のコピーは変更されませんが、オブジェクト内のデータの内容が変更されます。 オブジェクト型の場合、これは Object のサブクラスでもあります。ただし、メソッド内でそのメンバーの値を変更すると、その変更はメソッドの呼び出しが完了した後に有効になります。呼び出しが完了すると、そのメソッドへの元の参照は新しいオブジェクトを指さなくなります。
Java パラメータは、プリミティブ型であろうと参照型であろうと、コピーによって渡されます (値によるという別の言い方もありますが、次のように言うと理解しやすいです)値による受け渡しは通常、アドレスに対して相対的なものです)。
パラメータの型がプリミティブ型の場合、渡されるのはパラメータのコピーであり、これは元のパラメータの値です。これは値の受け渡しと同じです。以前に議論しました。関数内でコピーの値が変更された場合、元の値は変更されません。パラメーターの型が参照型の場合、渡されるのは参照パラメーターのコピーであり、このコピーにはパラメーターのアドレスが格納されます。 。このコピーのアドレスが関数内で変更されていないが、アドレスの値が変更されている場合、関数内の変更は渡されるパラメーターに影響します。 new などの関数内でコピーのアドレスが変更された場合、コピーは新しいアドレスを指します。この時点では、渡されたパラメーターは依然として元のアドレスを指しているため、パラメーターの値は変更されません。 。
以上がJava パラメータの値の受け渡しと参照の受け渡しの概要 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。