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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java的call by value_call by value or reference ?

發布時間:2025/4/5 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java的call by value_call by value or reference ? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java中參數傳遞是傳值還是傳引用呢?很多人遇到這個問題都會馬上給你拋出這個例子:

對方不想和你說話并向你拋了一段代碼

class Entry{

Integer value;

public Entry(Integer v){

this.value = v;

}

@Override

public String toString() {

return "Entry[value=" + value + "]";

}

}

public class CallByDemo{

public static void swap(int a,int b){

int temp = a;

a = b;

b = a;

}

public static void swap(Entry e1,Entry e2){

Integer temp = e1.value;

e1.value = e2.value;

e2.value = temp;

}

public static void main(String[] args) {

int a = 1;

int b = 2;

System.out.println("before:a="+a+",b="+b);

swap(a,b);

System.out.println("after :a="+a+",b="+b);

Entry e1 = new Entry(new Integer(1000));

Entry e2 = new Entry(new Integer(2000));

System.out.println("before:e1="+e1+"e2="+e2);

swap(e1,e2);

System.out.println("after :e1="+e1+"e2="+e2);

}

}

運行結果:

before:a=1,b=2

after :a=1,b=2

before:e1=Entry[value=1000]e2=Entry[value=2000]

after : e1=Entry [value=2000 ]e2=Entry[value=1000]

然后言之鑿鑿地拋出這個結論:

當參數為基本類型時為傳值

當參數為對象引用類型為傳引用

好像沒有毛病啊,但是如果我把swap(Entry e1,Entry e2)改成這樣呢?

public static void swap(Entry e1,Entry e2){

Entry temp = e1;//Integer temp = e1.value;

e1 = e2; //e1.value = e2.value;

e2 = temp;//e2.value = temp;

}

再次運行發現結果變成了這樣:

before:a=1,b=2

after :a=1,b=2

before:e1=Entry[value=1000]e2=Entry[value=2000]

after : e1=Entry [value=1000 ]e2=Entry[value=2000]

什么?怎么會這樣?

為了解釋這個問題,我們不妨看一下Java運行時內存結構:

Java Run-Time Data Areas

Java堆 (Java Heap)

作用:存放幾乎所有的對象實例和數組

組成

新生代(Young Generation)

Eden區:存放新創建的對象或短期的對象

Survivor區:存放GC后的幸存的或中期的對象

老年代(Old Generation):存放GC多次后始終存在或者長期的對象及Survivor區放不下的大對象

永久代(Permanent Generation):永久代在JDK8中被完全地移除

是否線程共享:是

Java虛擬機棧(JVM Stacks)

作用:存放棧幀

組成:棧幀

是否線程共享:線程私有的,生命周期和線程的相同

棧幀(Stack Frame)

- 作用:方法在執行的時候,都會有一個棧幀創建出來,用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息

- 組成:

- 局部變量表(Local Variables):存放編譯時可知的各種基本數據類型、對象引用

- 操作數棧(Operand Stacks):供方法調用時進行各種運算

- 動態鏈(Dynamic Linking):

- 方法出口

方法區(Method Area)

作用:存放被虛擬機加載的類的結構信息(如:字段和方法數據、方法的字節碼、運行時常量池等)、常量,靜態變量及類、實例、接口初始化時用到的特殊方法。

組成:方法區是堆的邏輯組成部分(有人稱之為永久代 Permanent Generation)

是否線程共享:是

本地方法棧(Native Method Stacks)

作用:存放本地方法調用時的棧幀

組成:棧幀

是否線程共享:線程私有的,生命周期和線程的相同

虛擬機執行Native方法時使用,不同的虛擬機有不同的實現方法,HotSpot虛擬機的本地方法棧和虛擬機棧合二為一。

PC寄存器/程序計數器(pc Register)

作用:保存JVM正在執行方法的字節碼指令的地址,如果該方法為native本地方法則為undefined

組成:一塊至少能夠保存一個本地指針或者returnAddress的值的內存空間

是否線程共享:每個線程都有一個獨立的程序計數器,各個線程之間計數器互不影響,獨立存儲

OK,我們再來分析一下上面的問題:

內存結果分析

其實呢,Java采用的是傳值(call by value),形參只是實際參數的一個拷貝,形參不能修改實參的內容。

當值為基本數據類型時,swap(int,int)方法中的局部變量a,b接收傳入的值并保存在與該方法對應的棧幀的局部變量表中。而main方法中的a,b保存在main方法對應的棧幀的局部變量表中,修改swap方法中的a,b對main方法中的a,b沒有任何影響,所以交換失敗。

當值為引用類型時,傳入方法的也是它的一個拷貝,當然這個拷貝有點特殊,它是Java Heap中的對象(Entry_e1、Entry_e2)的一個引用。該引用也保存在對應的棧幀的局部變量表中,修改swap方法中的e1,e2的引用指向對main方法中的e1,e2沒有任何影響,所以交換失敗。但局部變量e1,e2可以通過引用改變Heap中的對象的狀態,如第一段代碼中在swap中的局部變量可以通過引用來修改Heap中的對象的value屬性,從而達到交換屬性中的目的。

此外,需要注意的是Java中的某些類如:String、基本類型的包裝類、BigInteger、BigDecimal是不可變的,即無法修改其內容。

最后總結一句:Java是方法調用是值傳遞!

總結

以上是生活随笔為你收集整理的Java的call by value_call by value or reference ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丰满秘书被猛烈进入高清播放在 | 中文字幕中文字幕 | 精品一区二区三区毛片 | 亚洲美女啪啪 | 欧美va亚洲va | 国产黄频 | 午夜精品视频一区二区三区在线看 | 最好看的2019年中文在线观看 | 亚洲精品久久久久久久蜜桃臀 | 妞妞av | 五级毛片| 都市激情久久 | 成人a级免费视频 | 涩涩涩在线视频 | 高级毛片| 男女污污软件 | 国产99免费视频 | 五月婷婷丁香网 | 99热网站 | 美女被男人c | 久久精品丝袜高跟鞋 | 欧美久久天堂 | 夜夜操夜夜干 | 操夜夜| 天天干,天天操,天天射 | 黑人操欧美人 | 国产日韩精品一区二区三区 | 桃色综合网 | 亚洲a影院 | 国产精成人品免费观看 | 4438色| 三级久久| 亚洲专区欧美 | 在线激情av | 午夜资源| 91肉色超薄丝袜脚交一区二区 | 亚洲制服在线观看 | 日本午夜网| 亚洲精品在线免费观看视频 | 欧美精品videos | 成人免费视频一区 | 国产高清一区在线观看 | 色老头影视 | 日本中文字幕在线免费观看 | 无遮挡国产 | 亚洲香蕉久久 | 久久久久国产一区二区三区 | 亚洲精品久久夜色撩人男男小说 | 久久黄色录像 | 在线观看特色大片免费网站 | 色草在线 | 不卡中文字幕 | 三年中文在线观看免费观看 | 免费看日批| 国产黑丝av| 亚洲精品中文字幕乱码无线 | 在线免费观看黄网 | 182在线视频 | 成人网久久 | 97播播| 亚洲综合黄色 | 精品美女久久久 | 成人福利视频在线观看 | 在线播放黄色网址 | 国产白丝喷水 | 少妇闺蜜换浪荡h肉辣文 | 岛国大片在线 | 亚洲欧美国产精品专区久久 | 国产精品无码中文字幕 | 久久久www成人免费无遮挡大片 | 天天综合天天 | 成人观看视频 | 国产精品不卡 | 日韩欧美在线观看一区二区三区 | 欧美xxxxx性| 奇米影视大全 | 精品国产乱码久久久久久久软件 | 韩国三级在线 | 国产精华一区二区三区 | 激情九九 | 天天做天天干 | 亚洲国产中文字幕在线观看 | 成人一区二区三区在线观看 | 丰满人妻老熟妇伦人精品 | 叶全真三级 | 日韩av高清 | 亚洲影视一区 | 欧美日本日韩 | 葵司av在线| 老外毛片| 女同激情久久av久久 | 肉色超薄丝袜脚交一区二区 | 先锋影音av资源在线 | 骚av在线| 国产性猛交╳xxx乱大交 | 噜噜在线视频 | 天天躁夜夜躁狠狠躁 | 成人午夜黄色 | 九九精品九九 |