次のコードを実行します。結果はどうなりますか?
package com.test; public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = "test ok"; ch[0] = 'g'; } }
結果は次のとおりです:
good gbc
解説:
Java の文字列は不変です。つまり、初期化されると、その参照が指す内容は不変になります (注: 内容は不変です)。
つまり、コードに String str = "aa" str = "bb"; があるとすると、2 番目のステートメントは元のストレージ アドレス "aa" の内容を変更せず、別のアドレスを開きます。スペース。同時に「bb」を格納するために使用されます。str が元々指していた「aa」は現在アクセスできないため、jvm はそれを GC を通じて自動的にリサイクルします。
メソッドを呼び出すとき、String 型と配列は参照によって渡されます。上記のコードでは、str がパラメータとして change(String str, char ch[]) メソッドに渡されます。メソッド パラメータ str は、指す文字列を指します。ただし、 str = "test ok"; ステートメントにより、メソッド パラメータ str は、「test ok」を格納する新しく割り当てられたアドレスを指しますが、元の str は引き続き「good」を指します。配列の場合、change メソッドのメソッド パラメーター ch は、クラス内の ch が指す配列を指し、ch[0] = 'g'; ステートメントは、クラス < の ch が指す配列の内容を変更します。 🎜>
package com.test; public class Example { String str = new String("good"); char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str); System.out.println(ex.ch); } public void change(String str, char ch[]) { str = str.toUpperCase(); ch = new char[]{ 'm', 'n' }; } }
結果は次のとおりです:
good abc
Java での String 型変数の割り当てに関する上記の紹介は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、Script Home をサポートしていただければ幸いです。