Java には、値による受け渡しとアドレスによる受け渡しという 2 つのパラメーター受け渡しメカニズムがあります。
基本型がパラメータとして渡される場合、それは渡された値のコピーであり、このコピーをどのように変更しても、元の値は変更されません。
オブジェクトがパラメータとして渡される場合、メモリ内のオブジェクトのアドレスのコピーがパラメータに渡されます。これはアドレス渡しです。
public static void main(String[] args) { int n =3; // ① System.out.println(n); // 3 chageData(n); // ② System.out.println(n); // 3}public static void chageData(int num){ num = 10; // ③}
出力結果を観察し、n の値が変化していないことを確認します。
nとnumはどちらも基本型なので、値は変数に直接格納されます。
フローチャートは次のとおりです(コードの①②③に対応):
まず文字列の例を見てください:
public static void main(String[] args) { String str = "hello"; // ① System.out.println(str); // hello chageData(str); //② System.out.println(str); // hello}public static void chageData(String s){ s ="world"; // ③}
結果を観察してください。 strは変わっていません。フローチャートに基づいた分析は次のとおりです:
①が実行されると、メモリ内の実際の String オブジェクトを指すアドレス インデックスを含むオブジェクト参照 str がヒープ内に生成されます
②ではオブジェクト参照sを生成し、渡し参照により「hello」のアドレスインデックスも取得します。
③のオブジェクト参照を再割り当てします。オブジェクトの値が "hello" -> "world" である必要があるのは当然です。ただし、String が変更されると新しいオブジェクトが作成されるため、String は不変であるため、新しいオブジェクトが作成されます。
StringBuffer の例をもう一度見てください:
public static void main(String[] args) { StringBuffer stb = new StringBuffer("hello"); // ① System.out.println(stb); // hello chageData(stb); // ② System.out.println(stb); // hello world}public static void chageData(StringBuffer s){ s.append("world"); // ③} }
結果を観察すると、StringBuffer オブジェクトは可変であり、その内容を変更しても新しいオブジェクトは作成されないため、stb が変更されていることがわかります
上記は「14.Java Basics - Parameter Passing」の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。