String是值传递还是引用传递
String是值傳遞還是引用傳遞
今天上班時,同事發(fā)現(xiàn)了一個比較有意思的問題。他把一個String類型的參數(shù)傳入方法,并在方法內(nèi)改變了引用的值。 然后他在方法外使用這個值,發(fā)現(xiàn)這個String還是之前的值,并沒有改變。
這里要向大家介紹一下,大家都知道java在傳參時分為值?傳遞?和?引用傳遞?。參數(shù)為基本類型時是值傳遞, 參數(shù)為封裝類型時是引用傳遞。例如:
基本類型參數(shù)
public class Test {public static void main(String[] args) {int num = 0 ;changeNum(num);System.out.println("num="+num);}private static void changeNum(int num) {num = 1;} }打印的結(jié)果是num=0。
封裝類型參數(shù)
public class Test {public static void main(String[] args) {Product p = new Product();p.setProName("before");p.setNum(0);changeProduct(p);System.out.println("p.proName="+p.getProName());System.out.println("p.num="+p.getNum());}private static void changeProduct(Product p) {p.setProName("after");p.setNum(1);} }class Product {private int num;private String proName;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getProName() {return proName;}public void setProName(String proName) {this.proName = proName;} }運行的結(jié)果是:p.proName=after和p.num=1?。
上面的兩個例子是明顯的值傳遞和引用傳遞。但是如果參數(shù)是String類型呢?我們看一下具體的例子:
public class Test {public static void main(String[] args) {String str = "ab";changeString(str);System.out.println("str="+str);}private static void changeString(String str) {str = "cd";} }大家猜一下運行結(jié)果是什么呢?按照前面的例子,String應(yīng)該是一個封裝類型,它應(yīng)該是引用傳遞,是可以改變值得, 運行的結(jié)果應(yīng)該是”cd”。我們實際運行一下看看,
str=ab,這如何解釋呢?難道String是基本類型?也說不通呀。
這就要從java底層的機制講起了,java的內(nèi)存模型分為?堆?和?棧?。
1.基本類型的變量放在棧里; 2.封裝類型中,對象放在堆里,對象的引用放在棧里。java在方法傳遞參數(shù)時,是將變量復(fù)制一份,然后傳入方法體去執(zhí)行。?這句話是很難理解的,也是解釋這個 問題的精髓。我們先按照這句話解釋一下基本類型的傳遞
我們再解釋封裝類型的傳遞:
最后我們再來解釋String在傳遞過程中的步驟:
這樣我們理解了java在方法傳參的整個過程。其實還是上面那句比較重要的話?java在方法傳遞參數(shù)時,是將變量復(fù)制一份,然后傳入方法體去執(zhí)行。
歡迎訪問我的個人博客 www.liubo-tech.cn?
轉(zhuǎn)載于:https://www.cnblogs.com/boboooo/p/9066831.html
總結(jié)
以上是生活随笔為你收集整理的String是值传递还是引用传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP设计模式 -- 策略模式
- 下一篇: Nancy简单实战之NancyMusic