91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java是值傳遞嗎

發布時間:2022-09-08 15:02:05 來源:億速云 閱讀:99 作者:iii 欄目:互聯網科技

這篇文章主要講解了“java是值傳遞嗎”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java是值傳遞嗎”吧!

java是值傳遞;值傳遞是指在調用方法時將實際參數拷貝一份傳遞到方法中,這樣在方法中如果對參數進行修改,將不會影響到實際參數;當傳的是基本類型時,傳的是值的拷貝,對拷貝變量的修改不影響原變量;當傳的是引用類型時,傳的是引用地址的拷貝,但是拷貝的地址和真實地址指向的都是同一個真實數據,因此可以修改原變量中的值。

本教程操作環境:windows10系統、DELL G3電腦。

java是值傳遞還是引用傳遞

Java是值傳遞。

當傳的是基本類型時,傳的是值的拷貝,對拷貝變量的修改不影響原變量;當傳的是引用類型時,傳的是引用地址的拷貝,但是拷貝的地址和真實地址指向的都是同一個真實數據,因此可以修改原變量中的值;當傳的是String類型時,雖然拷貝的也是引用地址,指向的是同一個數據,但是String的值不能被修改,因此無法修改原變量中的值。

首先來解釋一下什么是引用傳遞,什么是值傳遞。

  • 引用傳遞(pass by reference)是指在調用方法時將實際參數的地址直接傳遞到方法中,那么在方法中對參數所進行的修改,將影響到實際參數。

  • 值傳遞(pass by value)是指在調用方法時將實際參數拷貝一份傳遞到方法中,這樣在方法中如果對參數進行修改,將不會影響到實際參數。

那在Java中到底是引用傳遞還是值傳遞呢?其實這個問題也一直是爭論不斷,而且官方也沒給個確切答案。但是就我個人理解,Java是值轉遞。

我們先來看一個簡單的例子:

public void test() {
    int a = 1;
    change(a);
    System.out.println("a的值:" + a);
}
private void change(int a) {
    a = a + 1;
}
// 輸出
a的值:1

在test()方法中定義了一個基本類型的變量a,然后調用change()方法試圖改變這個變量,最后輸出的還是原來的值。

首先我們要清楚,一個方法中的局部變量是存在棧中的,如果是基本類型的變量則直接存的是這個變量的值,如果是引用類型的變量則存的是值的地址,指向堆中具體的值。

上面的例子中,調用change()方法傳遞的a,其實是a變量的拷貝,不是真正的a,在change()方法中改變的是拷貝,對真正的a是沒有影響的。

這么一看,Java確實是值傳遞,但是我們再看下面這個例子,你就會糾結了

public void test() {
   User user = new User();
   user.setAge(18);
   change(user);
   System.out.println("年齡:" + user.getAge());
}
private void change(User user) {
   user.setAge(19);
}
// 輸出
年齡:19

看,對象里的屬性被改變了,不是值傳遞嗎,應該不會改變啊,這時候就有人總結了,當傳遞值是基本類型時是值傳遞、當傳的是引用類型時是引用傳遞。真的是這樣嗎?

分析這個問題,我們需要知道變量在jvm中是怎么存儲的。

首先看基本類型,這個很簡單,變量在棧中直接存的是值,傳到change()方法的是這個變量的拷貝,因此對拷貝的變量修改不會影響原變量的值。

接著看引用類型,變量在棧中存儲的是引用地址,這個地址指向堆中具體的值,如下圖:

java是值傳遞嗎

當調用change()方法傳入變量時,也是拷貝變量,但是這里的拷貝只是棧中的引用地址,并不會拷貝堆中的數據,因此會變成下圖這樣:

java是值傳遞嗎

雖然變量是拷貝,但是指向的地址是同一個,因此對變量中的數據修改時,還是會影響到原來真實的變量,但是,如果我們修改的是變量在棧中的地址,則不會影響原變量,例如下面這段代碼:

public void test() {
   User user = new User();
   user.setAge(18);
   change(user);
   System.out.println("年齡:" + user.getAge());
}
private void change(User user) {
   user = new User();
   user.setAge(19);
}
// 輸出
年齡:18

這種是修改變量在棧中的地址,則不會影響原變量。

說到這里,大家差不多懂了,但是回頭看最開始的那個問題,傳入String類型的變量,String是引用類型,按道理,原變量是會被改變的呀,結果怎么是不變呢?

String變量比較特殊,我們看String的源碼可以知道,String的值是通過內部的char[]數組來維護的,但是這個數據定義的是final類型的,因此,String的值是不可變的。我們平時修改String的值,其實是重新new了一個String對象,例如下面這段代碼:

String a = "hello";
a = "world";

這段代碼里,其實a變量并沒有被修改成world,只是重新new了一個String對象,這個對象的值是world,并把這個對象的引用地址賦給了a,原來的hello還是在堆中,只是這個值沒有被引用,過段時間會被gc垃圾回收。

String變量傳值在內存中的變化如下圖:

java是值傳遞嗎

String拷貝的是變量地址,但是它改變不了原String的值,因為String是不可變的,所以在change()方法中是重新new了一個String對象,改變的是新對象的值,原變量是沒有影響的。

感謝各位的閱讀,以上就是“java是值傳遞嗎”的內容了,經過本文的學習后,相信大家對java是值傳遞嗎這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林甸县| 宁明县| 辛集市| 安乡县| 沂源县| 辽中县| 平陆县| 黄龙县| 成都市| 新巴尔虎左旗| 津南区| 米泉市| 道真| 渝中区| 吴川市| 邳州市| 公安县| 镶黄旗| 绍兴县| 防城港市| 临汾市| 黄冈市| 九龙县| 马公市| SHOW| 沁水县| 城市| 台中市| 大方县| 开阳县| 南阳市| 衡东县| 木兰县| 象山县| 乌拉特后旗| 嘉善县| 长春市| 花莲县| 贵港市| 武宁县| 河津市|