私はJava に関するこの優れた記事reference semantics
を読んでいたJon Skeet
ところ、彼は次のように述べています。
仮パラメータ s を取る f という名前の手続きが存在すると仮定します。実パラメータ g を指定してその関数を呼び出します。
呼び出しコード:
f( g )
関数:
procedure f( s ) begin -- body of the procedure end;
Java のすべてのオブジェクト インスタンスはヒープに割り当てられ、オブジェクト参照を介してのみアクセスできます。したがって、次のものがあれば:
StringBuffer g = new StringBuffer( "Hello" );
変数 g には文字列 "Hello" が含まれていません。文字列 "Hello" を含むオブジェクト インスタンスへの参照 (またはポインター) が含まれています。
したがって、次に f( g ) を呼び出すと、f はその仮パラメーター s を自由に変更して、別の StringBuffer を指すようにしたり、null に設定したりできます。関数 f は、たとえば " World" を追加して StringBuffer を変更することもできます。これによりその StringBuffer の値が変更されますが、その StringBuffer の値は実際のパラメーター g の値ではありません。
私の理解は間違っているかもしれません。以下のプログラムは、メソッドに渡される Stringbuffer を変更します
public class MutabilityStringBuffer {
public static void main(String[] args){
StringBuffer sb = new StringBuffer("hello");
System.out.println("String before append: "+ sb.toString());
addString(sb);
System.out.println("Sting after append "+ sb.toString());
String s = "hello";
System.out.println("String before append: "+ s);
addString(s);
System.out.println("Sting after append "+ s);
}
public static void addString(StringBuffer word){
word.append(" world!");
}
public static void addString(String word){
word+=" world!";
}
}
もちろん、Jon Skeet が間違っているわけではありません。Stringbuffer
しかし、メソッドに渡すことで変更できることがわかりますstringbuffer
。これは変更可能であるため、Skeet が投稿したものとは少し矛盾しています。ここで私の理解を明確にしてください。
ありがとう