日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

String是值传递还是引用传递

發(fā)布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String是值传递还是引用传递 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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í)行。?這句話是很難理解的,也是解釋這個 問題的精髓。我們先按照這句話解釋一下基本類型的傳遞

  • 虛擬機分配給num一個內(nèi)存地址,并且存了一個值0.
  • 虛擬機復(fù)制了一個num,我們叫他num’,num’和num的內(nèi)存地址不同,但存的值都是0。
  • 虛擬機講num’傳入方法,方法將num’的值改為1.
  • 方法結(jié)束,方法外打印num的值,由于num內(nèi)存中的值沒有改變,還是0,所以打印是0.
  • 我們再解釋封裝類型的傳遞:

  • 虛擬機在堆中開辟了一個Product的內(nèi)存空間,內(nèi)存中包含proName和num。
  • 虛擬機在棧中分配給p一個內(nèi)存地址,這個地址中存的是1中的Product的內(nèi)存地址。
  • 虛擬機復(fù)制了一個p,我們叫他p’,p和p’的內(nèi)存地址不同,但它們存的值是相同的,都是1中Product的內(nèi)存地址。
  • 將p’傳入方法,方法改變了1中的proName和num。
  • 方法結(jié)束,方法外打印p中變量的值,由于p和p’中存的都是1中Product的地址,但是1中Product里的值發(fā)生了改變, 所以,方法外打印p的值,是方法執(zhí)行以后的。我們看到的效果是封裝類型的值是改變的。
  • 最后我們再來解釋String在傳遞過程中的步驟:

  • 虛擬機在堆中開辟一塊內(nèi)存,并存值”ab”。
  • 虛擬機在棧中分配給str一個內(nèi)存,內(nèi)存中存的是1中的地址。
  • 虛擬機復(fù)制一份str,我們叫str’,str和str’內(nèi)存不同,但存的值都是1的地址。
  • 將str’傳入方法體
  • 方法體在堆中開辟一塊內(nèi)存,并存值”cd”
  • 方法體將str’的值改變,存入5的內(nèi)存地址
  • 方法結(jié)束,方法外打印str,由于str存的是1的地址,所有打印結(jié)果是”ab”
  • 這樣我們理解了java在方法傳參的整個過程。其實還是上面那句比較重要的話?java在方法傳遞參數(shù)時,是將變量復(fù)制一份,然后傳入方法體去執(zhí)行。

    歡迎訪問我的個人博客 www.liubo-tech.cn?

    轉(zhuǎn)載于:https://www.cnblogs.com/boboooo/p/9066831.html

    總結(jié)

    以上是生活随笔為你收集整理的String是值传递还是引用传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。