Java評価の問題
1119 ワード
先日「Java仮想マシンに深く入り込む」という本を読んだときにJavaの値と参照について質問がありました.
そして自分でいくつかのテストをしました
まずテストクラスを書きました
最初は6が出力されると思っていましたが、クラスにとっては「参照値」が伝わっているので、次のStringBufferのように
IntegerもStringBufferも同じクラスなのに、なぜ前者は「引用を伝える」効果がなく、後者はあるのでしょうか.
後でJavaバーで聞いて大体結論が出ました
まず、基本データ型でカプセル化されたクラスはfinalであり、String、Long、Integerのように...だから彼らの参照オブジェクトは変更できないが、値を変更することができるが、String、Long、Integerなどのクラスは参照の「指向」の値を修正する内部方法を提供していないが、+や++などの操作では結果をnewオブジェクトに再配置し、したがってtestメソッドではIntegerは結果を格納するために1つのオブジェクトを再newしますが、StringBufferではappend()メソッドはStringBufferクラスのメソッドで、内部値を修正するために特化しているので、appendを呼び出すときに参照は変わりませんが、参照が指す値が変わったので「参照転送」の効果が得られます
そして自分でいくつかのテストをしました
まずテストクラスを書きました
public class Test{
public static void main(String []args){
Integer a =5;
System.out.println(test(a));//6
System.out.println(a);//5
}
public static Integer test(Integer b){
b++;
return b;
}
}
最初は6が出力されると思っていましたが、クラスにとっては「参照値」が伝わっているので、次のStringBufferのように
public class Test1{
public static void main(String []args){
StringBuffer sb=new StringBuffer("asdf");
System.out.println(test(sb));//asdfh
System.out.println(sb);//asdfg
public static StringBuffer test(StringBuffer sb){
sb.append("h");}}
IntegerもStringBufferも同じクラスなのに、なぜ前者は「引用を伝える」効果がなく、後者はあるのでしょうか.
後でJavaバーで聞いて大体結論が出ました
まず、基本データ型でカプセル化されたクラスはfinalであり、String、Long、Integerのように...だから彼らの参照オブジェクトは変更できないが、値を変更することができるが、String、Long、Integerなどのクラスは参照の「指向」の値を修正する内部方法を提供していないが、+や++などの操作では結果をnewオブジェクトに再配置し、したがってtestメソッドではIntegerは結果を格納するために1つのオブジェクトを再newしますが、StringBufferではappend()メソッドはStringBufferクラスのメソッドで、内部値を修正するために特化しているので、appendを呼び出すときに参照は変わりませんが、参照が指す値が変わったので「参照転送」の効果が得られます