java如何實現(xiàn)引用傳遞 Java真的有引用傳遞嗎?
Java真的有引用傳遞嗎?Java只有值傳遞,沒有引用傳遞。普通數(shù)據(jù)類型直接傳遞值,而對于引用類型來說傳遞值是所引用對象在堆區(qū)的內(nèi)存地址。java值傳遞和引用傳遞有什么區(qū)別?兩者的區(qū)別在于:Java的
Java真的有引用傳遞嗎?
Java只有值傳遞,沒有引用傳遞。普通數(shù)據(jù)類型直接傳遞值,而對于引用類型來說傳遞值是所引用對象在堆區(qū)的內(nèi)存地址。
java值傳遞和引用傳遞有什么區(qū)別?
兩者的區(qū)別在于:
Java的值傳遞需要為傳遞的值另行分配存儲空間,而引用傳遞就不需要,它只是把所傳值的地址傳過來,變量可直接到地址所指的存儲空間讀取值。
從這種意義上講,引用傳遞比值傳遞節(jié)省存儲空間。
為什么說java里面只有值傳遞?
關(guān)于這個問題,不同人對它的理解不盡相同。對初學(xué)Java的同學(xué)來說,可能簡單的認為Java中參數(shù)傳遞就是分為值傳遞和引用傳遞,至于為什么,因為課本上就是這么說的。對于有些工作年限的程序員來說,可能認為如果傳遞的參數(shù)類型是普通類型,那么就是值傳遞,如果參數(shù)是對象,那么就是引用傳遞。還有一些人認為Java中只有值傳遞,就是題主問題中的主題。
對Java編程語言來說,前兩種理解是錯誤的,Java中只有值傳遞。對于我來說,剛開始也是理解有值傳遞和引用傳遞一說的,但是隨著自己寫代碼的積累,慢慢發(fā)現(xiàn)并不是那么回事。那為什么只有值傳遞呢?
首先,來了解一下什么是值傳遞,什么是引用傳遞?
值傳遞是說在調(diào)用函數(shù)時,將實際參數(shù)值復(fù)制一份傳遞到被調(diào)用函數(shù)中,在被調(diào)函數(shù)中修改參數(shù)值不會影響原實參值。
引用傳遞是說在調(diào)用函數(shù)時,將實際參數(shù)的地址直接傳遞到被調(diào)用的函數(shù)中,在被調(diào)函數(shù)中修改參數(shù)值會影響原實參值。
如果傳遞的參數(shù)類型是普通基本類型,那么一定是復(fù)制一份實參值傳遞給形參的,但是當參數(shù)類型是對象的時候,也是復(fù)制的一份參數(shù)值傳遞給形參,只不過復(fù)制的是對象引用的地址,也就是在內(nèi)存中分配的存儲地址,不是直接傳遞的引用地址。
此時,可能有人會說那為什么將一個對象傳到另一個方法中,在這個方法中修改了這個對象的屬性值時,原調(diào)用方法中的對象屬性值也跟著變了,它不就是引用傳遞嗎?
其實,這是一個很容易迷惑的點。你仔細看看上面的陳述就會發(fā)現(xiàn),不是這么回事。將一個對象傳到另一個方法中,傳遞的是什么?傳遞的是對象引用的地址,這個對象引用的地址在另一個方法中被修改了嗎?原對象引用有受影響嗎?并沒有吧!
所以,Java中并沒有引用傳遞,只有值傳遞,不要再搞錯了!
我是『Java實戰(zhàn)技術(shù)』,關(guān)注我獲取更多原理分析、實戰(zhàn)技術(shù)!
為什么Java只有值傳遞,但C# 既有值傳遞,又有引用傳遞,這種語言設(shè)計有哪些好處?
引用傳遞的優(yōu)點:
有效避免了變量復(fù)制的開銷,比如參數(shù)是一個比較復(fù)雜的結(jié)構(gòu)體,那么使用引用傳遞就比直接傳遞來得好,性能會有優(yōu)勢。
引用傳遞的缺點:
引用傳參,在函數(shù)中對該變量所做的修改,在函數(shù)返回后依然存在,這有時候其實并不是開發(fā)者希望的結(jié)局。
至于Java為什么不提供引用傳遞這樣的機制,可能是Java語言設(shè)計者的一個思想問題,可能是為了保持簡單、統(tǒng)一性。比如JAVA里也沒有多繼承的概念,而在C 中是可以實現(xiàn)多繼承的。Java中沒有自定義值類型的方式,既然Java中所有自定義類型都是引用類型,那么這個語法作用就很有限,不支持就是正常的。
而C#提供這樣的機制,也是語言設(shè)計者的思路問題,可能是本著用戶怎么方便怎么來的初衷而設(shè)計,C# 原本設(shè)計是用來代替 C 做 win32 開發(fā)的,之前很多用MFC做winform的,C#的出現(xiàn)使得winform開發(fā)變得快速、簡單,我個人認為C#語言設(shè)計的很先進、優(yōu)秀。