Java中引用傳遞仍是值傳遞的問題

我喜歡的一篇文章在這兒:傳送門html

總結:ide

  1.雖然這篇文章沒有提到值傳遞和引用傳遞兩個概念,可是確解決了它們的根本問題。由於函數調用實際上也是給形參賦值的意思。函數

  2.由於值傳遞所研究的目的是,實參不隨形參的改變而改變,即實參先後相同。spa

    引用傳遞所研究的目的是,實參隨形參的改變而改變,即實參先後不一樣。code

  3.要看實參是否改變,須要知道一個知識:Java裏面的==號,比較的是兩個引用是否指向同一塊內存。htm

  例如:blog

    
1         String str1 = new String("1");
2         String str2 = new String("1");
3         System.out.println(str1 == str2);
View Code

    打印false,由於在堆中不能共用相同值的內存,str2必須用new在堆中從新申請內存。即str1和str2分別指向不一樣的內存,所以爲false。內存

  再例如:get

    
1         String str1 = "1";
2         String str2 = "1";
3         System.out.println(str1 == str2);
View Code

    打印true,由於棧中能夠共用內存,str2不用再在棧中申請內存了。即str1和str2指向同一塊內存,所以爲true。event

  4.有了上面3條知識,就能夠再考慮參數傳遞仍是值傳遞了。

    Java進行函數調用。就是將實參的引用賦給形參,也就是將實參所指的內存地址賦給形參。

    ①:實參所指地址在棧中,無論怎麼改變形參,都會在棧或堆中建立新的空間,不會改變實參的空間。

    ②:實參所指地址在堆中,則形參修改堆中的數據,會影響到實參所指的空間值。

  5.究竟是值傳遞仍是引用傳遞?值傳遞,由於引用永遠不會改變(慢慢體會)。會變得只有引用所指的內存存儲的內容。

 

擴展:從堆和棧的特性考慮問題,還能夠解決String和new String的問題,解決方法同理。

相關文章
相關標籤/搜索