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

歡迎訪問 生活随笔!

生活随笔

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

java

如何理解Java中参数传递只能传值?

發(fā)布時間:2025/3/20 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何理解Java中参数传递只能传值? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以前學習C#的時候,是完全在工作崗位上學習,一些底層較為深入的道理都不是很清楚。如今學習了Java,對于Java參數(shù)傳遞只能傳值,不能傳引用(指針)感到很困惑,在C#中不是常常說把某個引用傳遞到函數(shù)中嗎?甚至C#有相當簡便的ref、out參數(shù),明明白白的傳引用。

經(jīng)過一番探索,得出的結論表明,Java中我不管你到底是傳值還是傳引用,只需要記住原生數(shù)據(jù)類型(值類型)和String作為參數(shù)傳遞的時候,其原本的值都不會發(fā)生改變;而引用類型在作為參數(shù)傳遞時,函數(shù)中對其的操作,都會反饋到引用所指向的值。

這個結論不是和C#一模一樣嘛,除了C#可以方便的使用ref、out以外……

下面對Java中參數(shù)傳遞只能傳值進行解釋,事實證明,以前我對于C#的傳值還是傳引用理解的也不夠深入:

先申明:java中的參數(shù)傳遞都是值傳遞,沒有引用傳遞。
值傳遞的概念:值傳遞會為所傳遞的對象(這里的對象不是java里的對象object,而是一般意義上的對象)重新開辟一塊空間,于是對所傳對象的操作不會影響到原對象。
現(xiàn)象:有種說法是java中基本數(shù)據(jù)類型作參數(shù)是值傳遞,對象做參數(shù)是引用傳遞。實際上是錯誤的,真正的引用傳遞,是類似C語言中的指針傳遞,和C#中的ref參數(shù)。
理解:為什么對象做參數(shù)也是值傳遞呢?
分析:對象做參數(shù)傳遞的是對象的引用,暫且可以理解成對象的地址。由于是值傳遞,那么被傳遞的對象本身是不會有任何變化的,所以該對象的引用是不會發(fā)生任何變化的。

?

1、先舉一個原生數(shù)據(jù)類型的例子:

測試函數(shù):

public static void ValueTrans(int a){a = 2;//新產(chǎn)生一個值,開辟一個值類型出來,故值不會被修改。}

測試此函數(shù)的代碼:

int a = 1;System.out.println("a's value(before) = " + a);ValueTrans(a);System.out.println("a's value(after) = " + a);

打印出的結果:

a's value(before) = 1 a's value(after) = 1

安裝Java值傳遞的思想來考慮,這個結果是顯而易見的,pass by value,我只是把這個數(shù)值傳給你使用。

2、那么Integer如何理解呢?

測試函數(shù):

public static void ValueTrans2(Integer a){a = new Integer(2);}


其中a也是一個對象,那么這么傳入,是不是傳引用呢?調(diào)用了這個函數(shù),a的int值會不會被修改呢?

測試此函數(shù)的代碼:

Integer a2 = new Integer(1);System.out.println("a2's value(before) = " + a2);ValueTrans2(a2);System.out.println("a2's value(after) = " + a2);

打印出的結果:

a2's value(before) = 1 a2's value(after) = 1

結果表明,值仍舊沒有被修改。

如何解釋這個現(xiàn)象:

??? 理解這里的關鍵是區(qū)分對象和引用。這里聲明的a2是一個引用,而不是一個對象(只是Java把它設計為看上去好像是對象一樣)。這個引用它指向了一個對象,這個對象就是后面用new關鍵字生成的對象。因此,可以說a2指向了一個Integer對象。
??? 在調(diào)用ValueTrans2方法的時候,程序?qū)2作為參數(shù)傳遞給ValueTrans2方法了。這里仍然是值傳遞,在ValueTrans2調(diào)用過程中,會產(chǎn)生一份新的引用(不妨叫做y)。此時,a2和y指向了同一個對象。

??? 但是此時,我們讓y指向另外一個對象, y=new Integer(2); 此時a2和y就指向了不同的對象。y修改了它指向的對象的屬性,很顯然不會影響到a2指向的對象。

??? (這里不妨說明一下引用類型的傳遞,如我把一個引用類型x傳入函數(shù)中,這里也是值傳遞,在函數(shù)被調(diào)用的過程中,產(chǎn)生了一個新的引用y,x和y指向同一個對象。此時修改y指向的對象,也即修改x所指向的對象!那么引用類型的傳遞,會造成x所指向的值被修改)

圖解如下:

3、如何理解String?

如果你理解了2當中Integer的傳遞方式,那么我想String也不難理解。我們新建一個String,

String string = "old String";


實際上就是

String string2 = new String("old String");

Java的機制,造成當你使用一個String如"old String"時,會新建一個對象出來。

本著負責任的態(tài)度,仍舊把相應的測試函數(shù)貼上來:

public static void StringTrans(String string){string = "new String";}

測試函數(shù)的代碼:

String string = "old String";System.out.println("string's value(before) = " + string);StringTrans(string);System.out.println("string's value(after) = " + string);

打印出的結果:

string's value(before) = old String string's value(after) = old String

原因就是,實際上函數(shù)StringTrans是復制了一個引用指向原來的對象,但是函數(shù)又讓這個引用指向了新的String對象。這不會對原來的引用和原來的對象造成任何影響!

4、如何理解引用類型是傳值?

測試自定義類:

public class People {public int age;public String name;public People(int age, String name){this.age = age;this.name = name;} }

測試的函數(shù):

public static void ReferTrans(People people){people.age = 2;people.name = "lisi";}

測試函數(shù)的代碼:

People people = new People(1, "zhangsan");System.out.println("people's age(before) = " + people.age);System.out.println("people's name(before) = " + people.name);ReferTrans(people);System.out.println("people's age(after) = " + people.age);System.out.println("people's name(after) = " + people.name);

打印的結果:

people's age(before) = 1 people's name(before) = zhangsan people's age(after) = 2 people's name(after) = lisi

設新建的對象是PEOPLE,其引用是people,在調(diào)用ReferTrans方法是,仍然是值傳遞,方法賦值了一個引用people2,people2仍舊指向PEOPLE,所以操作people2對對象進行修改,即為對PEOPLE進行修改(String的話在此時已經(jīng)new了一個新對象出來),和使用people的效果一樣。表現(xiàn)出現(xiàn)來現(xiàn)象就是,當引用類型傳入函數(shù)時,函數(shù)中對其的修改,都會表現(xiàn)在原來的引用類型上。

圖解如下:

?

我一直認為只給分析過程,不給結論的都是耍流氓的行為。

結論

1、在實際的使用過程中,我們不必糾結那么多,原生數(shù)據(jù)類型和String,在傳入函數(shù)的時候,不管函數(shù)里面做什么,他的值都不會被修改。引用類型傳遞到函數(shù)中,只要函數(shù)中不是讓參數(shù)指向一個新建的對象,那么函數(shù)中的修改會反映到此引用類型上。

2、平時的處理上,可以把String和原生數(shù)據(jù)類型放在同一類的情況下使用,因為Java內(nèi)部使用了很多的機制,讓String看起來跟原生數(shù)據(jù)類型一樣。但是String歸根結底是一個引用類型,如在進行比較時,其他原生數(shù)據(jù)類型可以使用==,而String必須使用equals方法才能比較其內(nèi)部的值(這點C#做的非常好,直接使用==,不讓程序員過分的了解底層,我在做C#編程的過程中,甚至從來都沒有覺得string和值類型有什么不同)。

3、Java確實是只能傳值,不能傳引用。所謂傳引用,只在C、C++的傳指針和C#的ref中存在。

?

轉(zhuǎn)載于:https://www.cnblogs.com/Ebony-Ivory/p/4421529.html

總結

以上是生活随笔為你收集整理的如何理解Java中参数传递只能传值?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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