一文讓你徹底明白Java中的值傳遞和引用傳遞
基本概念
值傳遞:
傳遞對象的一個(gè)副本,即使副本被改變,也不會(huì)影響源對象,因?yàn)橹祩鬟f的時(shí)候,實(shí)際上是將實(shí)參的值復(fù)制一份給形參。
引用傳遞:
傳遞的并不是實(shí)際的對象,而是對象的引用,外部對引用對象的改變也會(huì)反映到源對象上,因?yàn)橐脗鬟f的時(shí)候,實(shí)際上是將實(shí)參的地址值復(fù)制一份給形參。
說明:對象傳遞(數(shù)組、類、接口)是引用傳遞,原始類型數(shù)據(jù)(整形、浮點(diǎn)型、字符型、布爾型)傳遞是值傳遞。
例子:
1、值傳遞:
public class Demo { public static void main(String[] args) { int num1 = 10; int num2 = 20; work(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void work(int a, int b) { int temp = a; a = b; b = temp; ? System.out.println("a = " + a); System.out.println("b = " + b); } }
運(yùn)行結(jié)果:
a = 20
b = 10
num1 = 10
num2 = 20
雖然在work()方法中a,b的值做了交換,但是主方法中num1,num2的值并未改變。
2、引用類型傳遞
public class ArrayListDemo { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; change(arr); System.out.println(arr[0]); } public static void change(int[] array) { System.out.println(array[0]); array[0] = 0; } }
運(yùn)行結(jié)果:
1
0
在change()方法中將數(shù)組的第一個(gè)元素改為0,主方法中數(shù)組的第一個(gè)元素也跟著變?yōu)?。
3、StringBuffer類型
public class Demo { ? public static void main(String[] args) { StringBuffer stringBuffer = new StringBuffer("北京異鄉(xiāng)人"); System.out.println(stringBuffer); ? changeStringBuffer(stringBuffer); System.out.println(stringBuffer); } ? public static void changeStringBuffer(StringBuffer stringBuffer) { stringBuffer = new StringBuffer("河北異鄉(xiāng)人"); stringBuffer.append(",哈哈哈"); } }
運(yùn)行結(jié)果:
北京異鄉(xiāng)人
北京異鄉(xiāng)人
也許你會(huì)認(rèn)為第2次應(yīng)該輸出“河北異鄉(xiāng)人,哈哈哈”,怎么輸出的還是原來的值呢,那是因?yàn)樵赾hangeStringBuffer中,又new了一個(gè)StringBuffer對象,此時(shí)stringBuffer變量指向的內(nèi)存地址已經(jīng)改變,所以主方法中的stringBuffer變量未受到影響。
如果修改changeStringBuffer()方法的代碼為:
public static void changeStringBuffer(StringBuffer stringBuffer) { stringBuffer.append(",歡迎大家關(guān)注"); }
則運(yùn)行結(jié)果會(huì)變?yōu)椋?/p>
北京異鄉(xiāng)人
北京異鄉(xiāng)人,歡迎大家關(guān)注
4、String類型
public class Demo { public static void main(String[] args) { String str = new String("北京異鄉(xiāng)人"); System.out.println(str); changeString(str); System.out.println(str); } ? public static void changeString(String string) { string = new String("河北異鄉(xiāng)人"); } }
運(yùn)行結(jié)果:
北京異鄉(xiāng)人
北京異鄉(xiāng)人
在changeString()方法中不管用string = “河北異鄉(xiāng)人”;還是string = new String(“河北異鄉(xiāng)人”);,
主方法中的str變量都不會(huì)受影響,也驗(yàn)證了String創(chuàng)建之后是不可變更的。
5、自定義類型
public class Person { private String name; public String getName() { return name; } ? public void setName(String name) { this.name = name; } ? public Person(String name) { this.name = name; } } ? public class ArrayListDemo { ? public static void main(String[] args) { Person person = new Person("李四"); System.out.println(person.getName()); ? changePerson(person); System.out.println(person.getName()); } ? public static void changePerson(Person p) { Person person = new Person("張三"); p = person; } }
運(yùn)行結(jié)果:
李四
李四
修改changePerson()方法代碼為:
public static void changePerson(Person p) { p.setName("張三"); }
運(yùn)行結(jié)果:
李四
張三
總結(jié)
到此這篇關(guān)于Java中值傳遞和引用傳遞的文章就介紹到這了,更多相關(guān)Java值傳遞和引用傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA面試題之緩存擊穿、緩存穿透、緩存雪崩的三者區(qū)別
當(dāng)服務(wù)器QPS比較高,并且對數(shù)據(jù)的實(shí)時(shí)性要求不高時(shí),往往會(huì)接入緩存以達(dá)到快速Response、降低數(shù)據(jù)庫壓力的作用,常用來做緩存的中間件如Redis等。本文主要介紹了JAVA面試時(shí)??嫉木彺鎿舸⒋┩?、雪崩場景三者區(qū)別,有興趣的小伙伴可以看一下2021-11-11Java實(shí)現(xiàn)一個(gè)順序表的完整代碼
順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般采用數(shù)組存儲(chǔ)。在數(shù)組上完成數(shù)據(jù)的增刪減改。順序表的底層是一個(gè)數(shù)組2021-04-04SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能
通過本文介紹的基本用法、序列化選項(xiàng)、事務(wù)支持、錯(cuò)誤處理和性能優(yōu)化技術(shù),開發(fā)者可以構(gòu)建高效可靠的Kafka消息發(fā)布系統(tǒng),事務(wù)支持特性尤為重要,它確保了在分布式環(huán)境中的數(shù)據(jù)一致性,感興趣的朋友一起看看吧2025-04-04解決RedisTemplate存儲(chǔ)至緩存數(shù)據(jù)出現(xiàn)亂碼的情況
這篇文章主要介紹了解決RedisTemplate存儲(chǔ)至緩存數(shù)據(jù)出現(xiàn)亂碼的情況,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03SpringBoot實(shí)現(xiàn)自定義啟動(dòng)器的示例詳解
雖然Spring官方給我們提供了很多的啟動(dòng)器供我們使用,但有時(shí)候我們也會(huì)遇到某些特殊場景,這些啟動(dòng)器滿足不了。這個(gè)時(shí)候就需要自定義一個(gè)啟動(dòng)器供我們使用,本文為大家介紹了SpringBoot實(shí)現(xiàn)自定義啟動(dòng)器的方法,希望對大家有所幫助2023-01-01Java基于二叉查找樹實(shí)現(xiàn)排序功能示例
這篇文章主要介紹了Java基于二叉查找樹實(shí)現(xiàn)排序功能,結(jié)合實(shí)例形式分析了Java二叉查找樹的定義、遍歷及排序等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08基于SpringBoot接口+Redis解決用戶重復(fù)提交問題
當(dāng)網(wǎng)絡(luò)延遲的情況下用戶多次點(diǎn)擊submit按鈕導(dǎo)致表單重復(fù)提交,用戶提交表單后,點(diǎn)擊瀏覽器的【后退】按鈕回退到表單頁面后進(jìn)行再次提交也會(huì)出現(xiàn)用戶重復(fù)提交,辦法有很多,我這里只說一種,利用Redis的set方法搞定,需要的朋友可以參考下2023-10-10