摘要:有種流行的觀點說的另外一個特殊之處在于,在方法調用傳參數時,是按值傳遞的,其他普通對象是引用傳遞。然而這種說法是大大錯誤的,至少是完全誤解了值傳遞和引用傳遞的概念。方法調用傳參只有一種傳遞就是值傳遞。
上篇文章說到Java的String是比較特殊的對象,它是不可變的。
有種流行的觀點說String的另外一個特殊之處在于,在方法調用傳參數時,String是按值傳遞的,其他普通對象是引用傳遞。
然而這種說法是大大錯誤的,至少是完全誤解了值傳遞和引用傳遞的概念。
值傳遞和引用傳遞的概念:
值傳遞在發生的時候會為callee參數新建一個變量,新的變量存儲的值與實參的值一致。
引用傳遞時,callee并不為參數變量新建對象,而是直接使用caller里的實參變量。
舉例來說:
public static void main(String[] args) { Object obj = new Object(); PassValue(obj); } private static void PassValue(obj) { String s = obj.toString(); }
如果是值傳遞,main函數中的obj和PassValue方法中的o是兩個獨立的變量,只是他們的值相等。
如果是引用傳遞,main函數中的obj和PassValue方法中的o根本就是同一個變量。
如果文字看的有點暈,請看手畫圖:
Surface上畫的有點抽象,包容一下。
打個比方,我要給你傳遞一些悄悄話,我把信息放到一個變量給你————一個txt文檔。我和你之間有兩種方式:
你直接訪問我們電腦,以后你看我電腦上的txt文檔————咱倆共享變量;
你也可以復制一份txt到你的電腦,以后你看你自己電腦上的那份txt文檔————你和我各用各的變量。
在代碼里,第一種方式就是引用傳遞,第二種就是值傳遞。
還是接著例子,我給你傳遞的txt有可能會有兩種形式:
直接在txt里寫著我要說的話"我看好你喲";
在txt里只有一個url,url指向一個網站,網站里寫著"我看好你喲".
第一種形式就是傳遞基本類型參數,第二張是傳遞引用類型參數。
所以,這里有四種組合,我們一一來看:
引用傳遞傳遞基本類型參數。你把txt文檔里的話改為可是我并不看好你啊,我看得到,因為你改的是我電腦上的txt文檔。
引用傳遞傳遞引用類型參數。你直接改txt里的url地址,或者你不改url,而且去改url指向的網站的內容,我都能看到;
值傳遞傳遞基本類型參數。你把txt文檔里的話改為可是我并不看好你啊,我看不到,因為你改的是你電腦上的那份txt。
值傳遞傳遞引用類型參數。你直接改txt里的url地址,我看不到,因為你改的是你電腦上的那份txt。你改url指向的網站的內容,我看的到。
對應代碼里,當傳遞參數為引用類型時,例子中改url地址就是在callee中改變變量指向的堆的位置,即指向另一個對象;改url指向的內容,即是改變量指向的那個對象的內容。當傳遞參數為基本類型參數時,例子中改變txt文檔內容,就是callee改變參數的值。
搞清楚概念了,怎么想都能把問題想明白。
回到開頭的問題,有人說String特殊,特殊在哪?無非有人發現String在callee里沒法被改,但是其他普通引用類型對象可以在callee里被改動?,F在我們可以說,這是廢話。因為String是不可變類,它的內容一經創建再不能變,別說你通過參數傳遞,你就是在主函數里,你照樣沒法改String對象的內容。所以String在callee中無法被改動和參數傳遞方式壓根沒有關系,這是String的不可變性問題,完全兩碼事。
可以看出來,如果參數傳遞的是引用變量,那么無論是哪種傳遞方式,callee對對象內容的改動,對caller都是可見的。除非你這對象壓根不能改。
Java方法調用傳參只有一種傳遞就是值傳遞。這并沒有道理可講,實現如此。
參考:
[1] https://en.wikipedia.org/wiki...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77082.html
摘要:我們在處新創建了一個并將其引用在處傳給了方法的參數該方法內部引用在處被重新賦值。如果是引用傳遞,那么引用在處已經被指向了新的輸出應該為才對,事實上是怎樣的呢事實上輸出了也就是說方法改變了傳入引用所指對象的值。此處注意,并非將重新分配,而是。 我們來看一個新手甚至寫了多年Java的朋友都可能不是十分確定的問題: 在Java方法傳參時,究竟是引用傳遞還是值傳遞? 為了說明問題, 我給出一個...
摘要:引用泛型除了方法因不能使用外部實例參數外,其他繼承實現成員變量,成員方法,方法返回值等都可使用。因此,生成的字節碼僅包含普通的類,接口和方法。 為什么要使用泛型程序設計? 一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義類的對應類型;如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。----摘自原書Ordinary classes and meth...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
摘要:接下了,我們調用方法,來嘗試改變的值以此驗證中的傳值方式。我們將作為實參傳給方法,形參來接受這個實參,在這里就體現出了兩種傳參方式的不同。中只有值傳遞這一種方式,只不過對于引用類型來說,傳遞的參數是對象的引用罷了。 前言 這幾天在整理java基礎知識方面的內容,對于值傳遞還不是特別理解,于是查閱了一些資料和網上相關博客,自己進行了歸納總結,最后將其整理成了一篇博客。 值傳遞 值傳遞是指...
閱讀 1905·2021-11-24 11:16
閱讀 3260·2021-09-10 10:51
閱讀 3199·2021-08-03 14:03
閱讀 1266·2019-08-29 17:03
閱讀 3244·2019-08-29 12:36
閱讀 2232·2019-08-26 14:06
閱讀 497·2019-08-23 16:32
閱讀 2677·2019-08-23 13:42