java中String數據類型
對於字符串對象來說雖然在參數傳遞的時候也是引用傳遞但是java虛擬機在函數內部對字符串對象進行了特殊處理視String對象為常量(final) 所以對傳進來的引用地址所引用的string對象比能直接進行修改而是產生一個副本對其進行操作對其進行的操作不會影響原來的值
下面我們看一例子(sun認證試題)來證明這一點
public class X {
public static void main (String[]args) {
string s = new string (Hello);
modify(s);
SystemoutprintIn(s);
}
public static void modify (String s) {
s += world!;
}
}
你說它會打印出什麼結果?是Helloworld?可能大部分人會說是這個答案吧哈哈結果卻是Hello為什麼呢?再仔細分析一下上邊所說的吧視String對象為常量(final) 這是問題的關鍵!在modify()方法中傳進了string對象雖然是引用傳遞上邊我們說了視String對象為常量(final)它不會修改原來地址所引用的值而是生成一個副本對其進行操作所以打印結果應該為Hello!下面再講一講java中對常量(final)是怎樣處理優化的以便更深入的理解上面的問題
java中的final變量java編譯器是進行了優化的每個使用了final修飾的變量的地方都不會通過連接而進行訪問比如說Test類中使用了Data類中一個final的int數字fNumber=這時候java編譯器會將這個常數編譯到Test類的指令碼或者常量池中這樣每次Test類用到fNumber的時候不會通過引用連接到Data類中進行讀取而是直接使 用
我們再來舉個例子說明這一點
public class TestFinal(){
public static void main(string s[]){
Systemoutprintln(FinalDatadate);
}
public class FinalData(){
public static final data=;
}
}
運行上面的TestFinal類結果為
但是你把FinalData類中的data=編譯後再運行TestFinal類結果還是這是因為編譯器把data的副本保存TestFinal類中所以在重新編譯TestFinal類之前TestFinal類一直把data認為是而不是是不是證明了上面所講述的每個使用了final修飾的變量的地方都不會通過連接而進行訪問!結合這個例子再深入的想一想第一個問題是不是就理解的更加清晰了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26692.html