String是被final修飾的類,所有看起來會修改String值的方法都是創建了一個新的String對象。
所以這裏要注意的是,String類型實例的傳遞永遠是值傳遞,而不是引用傳遞如下代碼
public class TestDemo{
String string = "99";
char[] c = {'a','b','f'};
Nimaha nimaha = new Nimaha() ;
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
testDemo.change(testDemo.string,testDemo.c,testDemo.nimaha);
System.out.println(testDemo.string+" "+testDemo.c[0]+" "+testDemo.nimaha.a);
}
public void change(String string,char[] c,Nimaha nimaha){
string = "ddd";
c[0] = 'd';
nimaha.a =2;
}
class Nimaha{
int a =1;
}
}
最終輸出的結果應該是"99 d 2"因爲傳入change的String是傳入了test.str的一個副本,char[] 和nimaha是真的傳入了實例對象。
如果想要讓str改變,應該在change中使用this關鍵字,具體情況如下
public void change(String string,char[] c,Nimaha nimaha){
this.string = "ddd";
c[0] = 'd';
nimaha.a =2;
}
最後記錄下:
堆區:只存放類對象,線程共享;
方法區:又叫靜態存儲區,存放class文件和靜態數據,線程共享;
棧區:存放方法局部變量,基本類型變量區、執行環境上下文、操作指令區,線程不共享;
寫在最後,個人猜測所有放在常量池裏面的數據,到最後都是數值引用。而對象,比如對象數組,比如自己定義的class都算作對象引用,都是可以直接引用對象改變數值的,是不是存在棧上面的數據就是數值引用?如果有大神看到了可以說一下。