java傳遞的是值還是引用,javastring是值傳遞還是引用傳遞

2021-03-03 21:01:23 字數 4794 閱讀 9382

1樓:育知同創教育

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

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

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

2樓:小傻

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

java 程式語言只有值傳

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

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

3樓:匿名使用者

你是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#傳遞的實際是二級指標,它的內容是棧中的變數的地址)。

4樓:育知同創教育

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

5樓:nice01青春

a = new string("s");

b = new string("s");

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

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

6樓:

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

7樓:月之子

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

js是引用傳遞還是值傳遞

8樓:育知同創教育

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

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

9樓:育知同創教育

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

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

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

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

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

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

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

11樓:始終灬執著

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

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

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

12樓:育知同創教育

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

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

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

13樓:育知同創教育

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

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

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

14樓:mpp跟著幸福走

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

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

15樓:育知同創教育

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

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

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

string是值傳遞還是引用傳遞

16樓:ijava學習網

string是引用型別,不過java有字串常量池機制,

2.  宣告字串常量或者字串常量連線都要用到字串常量池

3.  如果常量池中有該字串序列則返回,所以str建立了一個字串並放入常量池中,

str2內的字元序列已在常量池中所以str2直接指向str指向的物件。

而new string()一定會在堆上新建立物件,所以肯定false

案例//建立了一個物件

string str="aaa";

//指向一個物件,不是新建

string str2="a";

//同一個記憶體地址

str==str2返回true

string str2=new string("aaa");

//新建了一個物件,記憶體地址不一樣!

str==str2返回false

注;在java中,不能用「==」和「!=」來判斷兩個字串是否相等。因為string是引用型別,而不是基本資料型別。

故它們的比較是使用地址和值

來比較,因為它們是不同的物件,有不同的地址。故str1==str2永遠是false,而str1!=str2永遠都是true。

java中必須使用string1.equals(string2)來進行判斷

string s1="hello";

string s2="hello";

則(s1==s2)=true;

因為他們指向的同一個物件。

string s1=new string("hello");

string s2=new string("hello");

則(s1==s2)=false

如果把其他變數的值賦給s1和s2,即使內容相同,

由於不是指向同一個物件,也會返回false。

所以建議使用equals(),因為equals比較的才是真正的內容

案例 string string1=new string( "aaa" );

string string2=new string( "aaa" );

這兩個字串當然應該是相等的。

如果用表示式string1==string2,則該表示式的值為false

如果用表示式string1.equals(string2),則該表示式的值為true

C中的值傳遞和引用傳遞是什麼,python的值傳遞和引用傳遞區別,哪些型別值傳遞,哪些是引用傳遞

值傳遞,是指傳的是資料的副本 引用傳遞,是指傳遞的是資料的地址。舉個例子,地址0x00000001處的資料是5那麼,值型別傳遞的是5的副本 當然也是5 而引用傳遞的是地址0x00000001 值傳遞和引用傳遞最大的區別就是 值傳遞傳遞的是執行緒棧上的資訊的副本 引用傳遞是傳遞的執行緒棧上的資訊的存放...

值傳遞實現的是引數的單向傳遞實參形參,指標傳遞實現的

一樓解答的很好,不過有個筆誤 m i應該是 mm i,不知道我理解的對不對。函式呼叫時的實參和形參之間的資料是單向的什麼傳遞 實參傳遞給形參是單向傳遞,形參變數在未出現函式呼叫時,並不佔用記憶體,只在呼叫時才佔用。呼叫結束後,將釋放記憶體。執行一個被呼叫函式時,形參的值如果發生改變,並不會改變主調函...

C 函式返回型別是引用的問題,C 函式返回值為引用型別時出錯!大神進!

引用就是變數的別名,返回c3的引用,返回的就是c3 c3被清除,再呼叫c3的函式,結果當然不正確 如果返回 i 後,i被清除,但是返回值已經被輸出了,結果是正確的 返回c型別,g函式返回 的是c型別的一個物件,雖然c3被清除,但是返回的物件還能呼叫get函式 你可以在c類中增加一個解構函式,除錯執行...