我喜歡的一篇文章在這兒:傳送門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);
打印false,由於在堆中不能共用相同值的內存,str2必須用new在堆中從新申請內存。即str1和str2分別指向不一樣的內存,所以爲false。內存
再例如:get
1 String str1 = "1"; 2 String str2 = "1"; 3 System.out.println(str1 == str2);
打印true,由於棧中能夠共用內存,str2不用再在棧中申請內存了。即str1和str2指向同一塊內存,所以爲true。event
4.有了上面3條知識,就能夠再考慮參數傳遞仍是值傳遞了。
Java進行函數調用。就是將實參的引用賦給形參,也就是將實參所指的內存地址賦給形參。
①:實參所指地址在棧中,無論怎麼改變形參,都會在棧或堆中建立新的空間,不會改變實參的空間。
②:實參所指地址在堆中,則形參修改堆中的數據,會影響到實參所指的空間值。
5.究竟是值傳遞仍是引用傳遞?值傳遞,由於引用永遠不會改變(慢慢體會)。會變得只有引用所指的內存存儲的內容。
擴展:從堆和棧的特性考慮問題,還能夠解決String和new String的問題,解決方法同理。