java值傳遞和引用傳遞的區別,java的值傳遞和引用傳遞的區別

2021-03-19 18:19:20 字數 4867 閱讀 8969

1樓:育知同創教育

java裡只有值傳遞,不存在引用傳遞。

當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是該物件的引用一個副本,雖然看起來是傳遞的引用,但實際上只是引用的值的傳遞。這兩個值指向同一個物件,物件的內容可以在被呼叫的方法中改變,但物件的引用(不是引用的副本)是永遠不會改變的。

java值傳遞和引用傳遞的區別

2樓:兄弟連教育北京總校

值傳遞:(形式引數型別是基本資料型別):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是兩個不同的儲存單元,所以方法執行中形式引數值的改變不影響實際引數的值。

引用傳遞:(形式引數型別是引用資料型別引數):也稱為傳地址。

方法呼叫時,實際引數是物件(或陣列),這時實際引數與形式引數指向同一個地址,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式引數的改變將會影響實際引數。

3樓:始終灬執著

值傳遞:指的是在方法呼叫時,傳遞的引數是按值的拷貝傳遞,值傳遞重要特點:傳遞的是值的拷貝,也就是說傳遞後就互不相關了。

引用傳遞:指的是在方法呼叫時,傳遞的引數是按引用進行傳遞,其實傳遞的引用的地址,也就是變數所對應的記憶體空間的地址。傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個記憶體空間)。

java的值傳遞和引用傳遞的區別

4樓:育知同創教育

基本資料型別賦值屬於值傳遞;引用型別之間賦值屬於引用傳遞。

值傳遞傳遞的是實實在在的變數值;引用傳遞傳遞的是物件的引用地址。

值傳遞後,兩個變數改變的是各自的值;引用傳遞後,兩個引用改變的是同一個物件的狀態。

5樓:mpp跟著幸福走

引用傳遞傳遞是地址值,你也可以把他看成是值的傳遞

java string是值傳遞還是引用傳遞

6樓:小傻

java string值傳遞,可以參考如下解釋:

java 程式語言只有值傳

遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是該物件的引用一個副本。指向同一個物件,物件的內容可以在被呼叫的方法中改變,但物件的引用(不是引用的副本)是永遠不會改變的。

java傳遞引數都是值,如果是物件的話,就是將引用的值複製一份給方法當引數。如果是根據引用把堆裡的物件修改了,那麼物件真被修改了,不過不是被建立賦值給的那個引用修改的,是方法裡的一個複製的引用副本給修改的。

7樓:匿名使用者

你是c/c++或是vb轉過來的嗎?在java中過多考慮引用(指標)和值之間的關係是步入歧途,這正是java的設計者極力避免你考慮的問題。

你需要明白的是:

1、java中所有方法的引數的傳遞都是「值傳遞」;

2、java中所有物件型別的變數的「值」,本質上說,包含了java堆中的實際物件的地址,你可以大體認為java的變數對應了c/c++中的指標(其實這裡面有更復雜的機制)。事實上,java並不像c/c++一樣明確的區分「值語義」與「引用語義」,java棧中也不會存放任何物件的實體(這點與c/c++不同,c/c++棧中可以存放物件實體),所有的java物件都是在堆中。

概念上的區別在於,我這裡提到的「變數」是指java棧中的內容,對應你說的「引用」;我提到的「物件」是指java堆中的實體,對應你說的「值」。而一般java教材中提到的「值傳遞」,是指這些「變數」的內容的傳遞,不是java堆中的物件實體的傳遞。

你用字串來做實驗,並推廣為所有java物件的做法,並不是特別合適。java的string型別有特殊的處理:所有編譯期認識的字串,都會被放到常量池,於是下面的語句:

a = "s";

b = "s";

a和b並不像其它物件一樣有建立的動作,都是直接指向常量池中的"s",所以你可以得到a==b。而下面的語句:

a = new string("s");

b = new string("s");

是分別在java堆中建立了2個物件,此時a!=b。

本質上說,對於基本資料型別(整數、字元等),java的符號==,用於判斷二者的值是否相等;對於物件型別,java的符號==,用於判斷兩個變數是否是「同一個物件」,equals()方法才是用於判斷兩個物件是否相等。

你希望實現的swap邏輯,在java中通常認為是無法實現的。拿你這個例子來說,swapvalue()中的tmpvalue無論怎麼更改,只是改變tmpvalue自己的內容(即不斷指向不同的物件),並不會改變value中的內容(始終指向同一個物件)。這也是為什麼java最初說自己永遠是值傳遞。

你只有改變tmpvalue指向的物件的值(通過呼叫這個物件的方法或是更改它的屬性),使用value訪問時,才能看到這些改變。

為了彌補這個缺陷,c#才加入了ref關鍵字,允許傳入變數的引用(如果參考c/c++,c#傳遞的實際是二級指標,它的內容是棧中的變數的地址)。

8樓:育知同創教育

string是物件,傳遞的是引用,但是它有值的特性

9樓:nice01青春

a = new string("s");

b = new string("s");

是分別在java堆中建立了2個物件,此時a!=b。

改正:a,b 的hashcode都是一樣的,a==b的

10樓:

你好,請注意java語言裡不存在引用傳遞這個說法,所以不管是物件還是基本資料型別,都是值傳遞

11樓:月之子

string並不是基本資料型別,當然是引用傳遞啦!

java值傳遞和引用傳遞的區別java核心卷

12樓:育知同創教育

1.基本型別和引用型別在記憶體中的儲存

java中資料型別分為兩大類,基本型別和物件型別。相應的,變數也有兩種型別:基本型別和引用型別。

基本型別的變數儲存原始值,即它代表的值就是數值本身;

而引用型別的變數儲存引用值,"引用值"指向記憶體空間的地址,代表了某個物件的引用,而不是物件本身,

物件本身存放在這個引用值所表示的地址的位置。

基本型別包括:byte,short,int,long,char,float,double,boolean,returnaddress,

引用型別包括:類型別,介面型別和陣列。

相應的,變數也有兩種型別:基本型別和引用型別。

2.變數的基本型別和引用型別的區別

基本資料型別在宣告時系統就給它分配空間:12

int a;

a=10;//正確,因為宣告a時就分配了空間

引用則不同,它宣告時只給變數分配了引用空間,而不分配資料空間:12

3456

7date date;

//執行例項化,開闢資料空間存放date物件,然後把空間的首地址傳給today變數

//date=new date();

//如果註釋掉上一步操作

//the local variable date may not have been initialized

//也就是說物件的資料空間沒有分配

date.getdate();

看一下下面的初始化過程,注意"引用"也是佔用空間的,一個空object物件的引用大小大概是4byte:12

3date a,b; //在記憶體開闢兩個引用空間

a = new date();//開闢儲存date物件的資料空間,並把該空間的首地址賦給a

b = a; //將a儲存空間中的地址寫到b的儲存空間中

3.引用傳遞和值傳遞

這裡要用實際引數和形式引數的概念來幫助理解,

值傳遞:

方法呼叫時,實際引數把它的值傳遞給對應的形式引數,函式接收的是原始值的一個copy,此時記憶體中存在兩個相等的基本型別,即實際引數和形式引數,後面方法中的操作都是對形參這個值的修改,不影響實際引數的值。

引用傳遞:

也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,函式接收的是原始值的記憶體地址;

在方法執行中,形參和實參內容相同,指向同一塊記憶體地址,方法執行中對引用的操作將會影響到實際物件。

js是引用傳遞還是值傳遞

13樓:育知同創教育

js引數的傳遞是按值傳遞的,引用型別傳遞是一個指標的副本。並不是引用傳遞

js是按值傳遞還是按引用傳遞

14樓:育知同創教育

是傳值的,物件型別的值其實是個記憶體地址,比如你家的地址,你告訴人家你家地址是xx路xx號,別人就根據這個地址找到你家的位置,所以說xx路xx號就是一個物件型別的值,不管這個值複製多少遍,他所指向的都是同一個地方,也就都會找到那個地方的唯一一個物件

這就是物件型別的值是地址而不是真正物件本身

java 傳遞的是值還是引用

15樓:育知同創教育

java 八大基本型別做為引數為 值傳遞

object物件做為引數為 引用傳遞

java語言是按照值傳遞還是引用傳遞的

16樓:育知同創教育

(1):「在java裡面引數傳遞

都是按值傳遞」這句話的意思是:按值傳遞是傳遞的值的拷貝,按引用傳遞其實傳遞的是引用的地址值,所以統稱按值傳遞。

(2):在java裡面只有基本型別和按照下面這種定義方式的string是按值傳遞,其它的都是按引用傳遞。就是直接使用雙引號定義字串方式:string str = 「java私塾」;

vb按值傳遞引數和按地址傳遞引數的講解希望簡明扼要但是儘量全面我看書學不太會

沒人回答?那我說點吧 個人理解 byref 按地址傳遞。將改變數地址傳給函式,如果在函式過程中改變該變數,那麼函式結束後該變數值也跟著改變了。byval 按值傳遞。跟上面相反啦。例子 private sub form load a 123 b abc call crazy0qwer a,b msgb...

為什麼說向函式傳遞引用實現了形參和實參的資料雙向傳遞

引用傳遞就是將實參地址傳遞給函式,函式接收到地址後並不另外在棧上分配臨時記憶體空間版儲存該地址,而是直權接當做實參本身使用,如果實參含有有效資料,則函式可以通過引用直接取出 讀 也可以對其賦值 寫 如果將實參傳遞給函式稱為正傳遞,那麼函式返回資料就是逆傳遞。由於函式返回值是通過退棧方式傳遞,而且編譯...

資料庫裡面完全依賴和傳遞依賴有區別

在不同的情況下,結論不同。如果x y,y z是完全依賴,且x是一個屬性 不存在非空真子集 那麼,x z可以是完全依賴也可以是傳遞依賴 顧客吃飯依賴廚師,顧客吃飯依賴服務員傳遞選單到廚師 肯定的了,要是沒有的話,怎麼判斷正規化呢 資料庫裡完全依賴和傳遞依賴有什麼區別,這兩個能不能在同一張表中共存?肯定...