Java 到底是值傳遞還是引用傳遞?

時間 2021-05-08 02:41:50

1樓:望月

首先,舉個例子:

public class Main {

public static void main(String argsFoo f = new Foo("f"changeReference(f); // 不會修改引用modifyReference(f); // 會修改引用物件public static void changeReference(Foo aFoo b = new Foo("b"a = bpublic static void modifyReference(Foo cc.setAttribute("c"

我來解釋下:

1、宣告了乙個Foo型別的引用f,並且給它分配了乙個新的型別為Foo的物件,並且這個物件有乙個屬性,賦值為「f」

Foo f = new Foo("f");

2、從方法的角度看,宣告了乙個引用型別為Foo的變數a,並且初始化為null

public static void changeReference(Foo a)

3、當你呼叫方法changeReference的時候,f被作為引數賦值給了a

4、再宣告乙個型別為Foo的引用b,並且b的屬性賦值為「b」

Foo b = new Foo("b");

5、a=b , 把乙個新的引用賦值給了a,而不是f,b物件的屬性為「b」

6、當呼叫modifyReference(Foo c)方法的時候,c 引用被建立並且指向物件f,其屬性「f」

7、c.setAttribute("c"); 把物件f的屬性由「f」改為「c」

這麼乙個簡單的例子應該有助於大家理解吧!

2樓:上吊的長頸鹿

不是Pass by value;也不是Pass by reference

而是Pass by object reference,它傳的是引用的別名(本質上是引用)。

在函式裡對別名來回操作,然後去看主函式裡變數是否改變,你就會驚訝的發現,你搞這個別名沒用(主函式中變數不會變),但是你去呼叫這個別名的方法有用(主函式變數會變),因為別名本質上就是乙個破引用,他能有啥方法,它所指的object才有method

3樓:土豆裡的黑鑽

這個問題其實很好理解。首先你要知道你傳入方法的引數是基本型別還是引用型別。如果是基本型別那你傳進去的就是乙個值,在方法體裡你可以對這個值進行任何操作但是對於傳入進去的實參變數來說他不受任何影響。

舉個例子

inta=10

;public

void

add(

inta

)add(a

)這時候即便你呼叫了add方法,但是對於變數a來說,他的值沒有變.

然後咱們再來說說引用型別,當你傳進去的時候是引用型別的時候,那就要看你方法體內部是否有對這個引用型別進行操作.我所謂的操作不是說重新賦值,而是呼叫物件的方法對物件本身進行操作.

繼續舉個例子

Stringa=

"Hello"

;public

void

change

(Stringa)

change(a

)這就是我說的重新賦值,你標題裡的也是這個意思. 你把String的引用變數傳進去,他本來指向的是"Hello",而你在方法體裡讓他重新指向了"Hi",但是對於原來的變數a來說並沒有任何的改變,改變的只是方法體裡的a,你方法體外的a原本指向"Hello",他還是指向"Hello".

然後我們來說說什麼是對物件的操作.

StringBuffera=

newStringBuffer(」

Hello」);

public

void

change

(StringBuffera);

change(a

);這時候如果你列印的話你可以看到a的值是發生了改變的.產生這個的原因是因為傳進去的是乙個引用,而這個引用指向了"Hello",當你呼叫了a的方法的時候,他對"Hello"這個物件進行了reverse的操作.而方法體外的a由於指向的是同乙個物件,所以當你列印的時候會發現值發生了改變.

然後最後我想說的是String是個比較奇怪的"物件",,比如說當你String a = "a"了之後,"a"這個值不能改變,你只能改變變數a的引用物件.

4樓:chen chen

方法呼叫時,如果傳遞的引數是個物件的話,就用乙個例子說明下這種情形:

美女A有一張去動物園的地圖。

現在美女B也想去動物園,可是她沒有地圖,

顯然會發生下面兩種情況:

美女A拿了另一張一模一樣的地圖給美女B,這就是值傳遞。雖然看地圖都能找到動物園,但是就地圖本身而言,倆美女手上的兩張地圖實際上一點關係都沒有,A和B都影響不了對方手上的地圖。

美女A和美女B一人乙隻玉手,一起拿起A的地圖看,這時候A或者B誰不高興都能當場把地圖撕了,這就是引用傳遞。因為對於被傳遞的地圖本身,A和B雙方都可以改變它。

地圖 => 位址

動物園 => 該位址上存放的物件

5樓:黃哥

這個程式語言很多概念基本差不多。

可以簡單粗暴的理解為「都是傳值」,如果引數是值型別,那麼複製乙份值,函式內部不能修改原來的值。

所謂的引用也是傳的值,只不過這個值是乙個物件的引用,函式中可以修改原來的值。

請看Go 語言的例子,

黃哥:黃哥Go語言文章: 函式傳slice 有的時候並不能修改原來的值

Python的例子

黃哥:Python 引數傳引用還是傳值?

6樓:夜晨

public class Test {

/*** 引用傳遞:傳引用本質沒有任何實參的拷貝,一句話,就是讓另外乙個變數也執行該實參。就是兩個變數指向同乙個物件。這是對形參的修改,必然反映到實參上。

* 值傳遞:實參的拷貝,改變形參不會改變實參*@paramargs

*/輸出結果:

形參改變引用前-形參引用位址1364335809形參改變引用後-形參引用位址458209687

7樓:莊庸

這個問題很困難嗎?那可能是開始學習時老師也稀里糊塗的。一句話就能說明白,只有值傳遞,關鍵看傳的值是什麼,是簡單值還是變數位址。

8樓:stormfeng

基本型別和String,傳遞值;其他引用型別,傳遞址

這麼理解就行了,其他的原理不求甚解。

得分最高的解釋也是模稜兩可,讓人看不懂。

9樓:李巨集杰

Call by reference (also referred to as pass by reference) is an evaluation strategy where a function receives an implicit reference to a variable used as argument,rather than a copy of its value.

複製了就是傳值, 沒複製就是傳引用, 就問你複製了沒。

10樓:靳遺山

值傳遞。

你可以將引用看做指向指標的指標。

引用本身是乙個變數,有著自己位址,引用的值是乙個指標,指向物件的位址。

值傳遞就是將引用的值賦予另外乙個變數。

引用傳遞就是將引用的位址作為值,賦予另外乙個變數。

11樓:Mao Bravo

函式做引數傳遞的時候

1.基本型別做的是值傳遞

2.引用型別做的是位址傳遞

所以第乙個是傳遞位址。所以位址本身上資料的改變也影響原先指向這個位址的資料

第二個String 有點特殊。。。它不是基本型別。。但string 做str+="is a";的時候。。

是另外建立乙個位址。。所以。。原位址的資料是不會變的。。

如果你想用位址的話。。用stringbulider。。。這也就是為什麼很多部落格推薦用stringbuilder 來做字串的增加。。

因為節省記憶體位址

第三個麼。。就很好理解了。。僅僅是把值傳進去了吖。你傳進去乙個int 的num 然後做了加法。。只會在棧中建立乙個新的位址。。他的值是num+1,但並不影響原來的num

12樓:小千戶

這篇部落格還是挺有用的,至少我的問題解決了

13樓:

基本型傳值,類傳的是引用。還有,函式引數是簡單的複製,而且,引用可以操作類物件,也可以賦值新的物件。你對照下你的這幾種情況。

14樓:林其如

從原始碼來解釋:

public final class Stringpublic final class StringBuilder乙個是final的乙個不是。

15樓:

public

static

void

main

(String

args

)public

static

void

change

(Stringx)

傳過去的引數實際拷貝了乙份,剛開始一同指向"ab",後來指向「cd」就跟原來x的沒什麼關係了。

16樓:wuxinliulei

實名贊同 @Intopass的答案

再舉個例子例證下

public

class

Employee

public

class

Main

public

static

void

main

(String

args)}

在changeEmployee當中是不是使用新的引用,決定原值改變與否

17樓:

想明白這個問題,你得清楚你例子中具體過程,比如值型別被自動裝箱(int to Integer),還有字串的特性,不要光從字面上記概念。

Matlab函式傳參方式是傳值還是傳指標?

MATLAB 函式引數傳遞是傳值,但是並不一定產生複製,只有在輸入引數被修改的時候才有可能複製,即所謂的 Copy on write,例如 function maina rand 10000 tic,b1 test1 a toc a 沒有被修改,不複製資料,只是引用 tic,b2 test2 a t...

到底什麼是雜湊值,雜湊值到底是怎麼生成的,有什麼用?

doge hash值是通過乙個計算函式把難以比較的字串或者其他型別的資料對映成乙個整數,最常用的就是對映a z的hash值,變成hash str i a 這個數是乙個十進位制數,這個十進位制數把它對映到0 25,也就是陣列下標,但通常來說是對映成1 26,因為方便計算,這是最簡單的hash值,然後這...

水滸傳裡到底是方臘厲害還是遼國厲害?

故事小王錢哲文 征遼時無損,戰方臘掛了一半,這個主要是劇情需要,很難講誰更厲害。但是徵遼的時候,主要是兩軍對陣剛正面,而方臘那邊以守為主,兼有地利因素,所以難度要大很多。孫子兵法 說 故上兵伐謀,其次伐交,其次伐兵,其下攻城。攻城之法,為不得已。可見,攻城連孫子都頭疼,梁山更是吃了暴虧。最先掛掉的三...