Java:按值傳遞還是按引用傳遞
最近看java堆疊,發現可以很好的解釋按值傳遞還是按引用傳遞
首先可以明確的說只有值傳遞
首先了解下堆疊:
棧:存放的是java的基本變數和物件的引用
堆:存放的是物件或陣列,也就是new出來的物件。
int a = 9;
這裡a就是物件的引用,9就是基本變數
Person p = new Person();
這裡p就是物件的引用,new Person()就是物件
程式執行永遠都是在棧中進行的,因而引數傳遞時,只存在傳遞基本型別和物件引用的問題。不會直接傳遞物件本身。
所以如果傳遞的是基本型別,那麼傳遞的就是值,如果傳遞的是物件的引用,傳遞的就是引用的地址。
圖一:基本型別
從控制檯的結果大家可以明顯的看到對於基本型別是把值傳遞過去了,第三次打印出來的還是10,並沒有發生變化
圖二:物件的引用
物件引用是把堆地址的地址值傳遞過去了,main方法裡面的a和change方法裡面的a是兩個不同的物件的引用,他們指向同一個堆地址,
在change方法裡面修改了這個地址對應的值,那麼main方法裡面的a指向的值也改變了,所以第三次打印出來的還是20。
另外對於String來說,由於是final修飾的,所以看做和基本變數一樣處理。
相關推薦
細談 C++ 返回傳值的三種方式:按值返回、按常量引用返回以及按引用返回
一、引言 停滯了很久,最近又開始細細品味起《Data Structure And Algorithm Analysis In C++》這本書了。這本書的第一章即為非常好的 C++11 統領介紹的教材範文,可能對於 C++11 新手來說,作者這樣短篇幅的介紹或許有些蒼白晦澀,但是對於我
Java到底是值傳遞?還是引用傳遞?
這時候應該都恍然大悟了吧。在new一個新的物件出來之後,methodTwo方法的a指向了新的物件例項,所以怎麼改變都不會改變main方法中a的物件。同時也可以證明,java中只有值傳遞沒有引用傳遞,在傳遞物件時,是傳遞物件的引用的副本,不是直接傳遞物件的引用本體。
Java中只有值傳遞,沒有引用傳遞
先來看一個作為程式設計師都熟悉的值傳遞的例子: ... ... //定義了一個改變引數值的函式 public static void changeValue(int x) { x = x *2; } ... ... //呼叫該函式 int num = 5;
Java的引數傳遞到底是引用傳遞還是值傳遞
首先看一段程式碼: public static void main(String[] args) { Person a = new Person(23, "a"); Person b
java 中的值傳遞,與引用傳遞
個人理解: 基本型別在方法中傳遞引數,僅僅是拷貝的值做出改變,自身沒有任何變化,所以,基本型別在作為引數傳入後,自身沒有任何的改變。 引用型別傳入方法的是自身的地址的拷貝,如果通過對拷貝的地址所指向的物件進行操作那麼物件會發生變化,因為兩個地址指向的是同一個物件,如果
Java:函式式介面、方法引用
1、函式式介面-概念及格式 函式式介面:有且只有一個抽象方法的介面(可以有其他的方法:預設方法,靜態方法,私有方法…) 2、函式式介面[email protected]註解 1)、在定義函式式介面時,為防止發生定義錯誤,可使用@FunctionalIn
C/C++語言引數傳遞----值傳遞、引用傳遞、指標傳遞、指標引用傳遞
1.值傳遞 void f( int p){ printf("\n%x",&p); printf("\n%x",p); p=0xff; } void main() { int a=0
C#形參,實參,值傳遞引數,引用傳遞引數,輸出引數,引數陣列的學習
1)形參 形參顧名思義就是形式上的引數,不是實際的引數,它代替實際傳入方法的值。在方法體程式碼中代表了值本身參與運算。形參定義於引數中,它不同於方法體內區域性變數,因為是一個變數,在它的作用域內不允許存在一個同名的區域性變數,不管他們的型別是否相同,都是不允許出現同名的
【Qt】訊號和槽對值傳遞引數和引用傳遞引數的總結
在同一個執行緒中 當訊號和槽都在同一個執行緒中時,值傳遞引數和引用傳遞引數有區別: 值傳遞會複製物件;(測試時,列印傳遞前後的地址不同) 引用傳遞不會複製物件;(測試時,列印傳遞前後的地址相同)
PHP-變數(二)(變數值傳遞與引用傳遞,及值傳遞轉換成引用傳遞)
1. PHP 中的資料型別簡單介紹 在講解 值傳遞 和 引用傳遞 之前,先來了解下 php 中的資料型別 php 中的資料型別大體分為三類: ① 標量資料型別:字串型、整型、
Java:按值傳遞與按引用傳遞
src alt pan microsoft href tar 按引用傳遞 mic users 原鏈接:傳送門 前天在做系統的時候被Java中參數傳遞問題卡了一下,回頭查閱了相關的資料,對參數傳遞問題有了新的了解和掌握,但是有個問題感覺還是很模糊,就是Java中到底是否只存
Java:按值傳遞還是按引用傳遞詳細解說
前天在做系統的時候被Java中引數傳遞問題卡了一下,回頭查閱了相關的資料,對引數傳遞問題有了新的瞭解和掌握,但是有個問題感覺還是很模糊,就是Java中到底是否只存在值傳遞,因為在查閱資料時,經常看到有人說Java只有值傳遞,但有人說既有值傳遞,也有引用傳遞,
Java:按值傳遞還是按引用傳遞
最近看java堆疊,發現可以很好的解釋按值傳遞還是按引用傳遞 首先可以明確的說只有值傳遞 首先了解下堆疊: 棧:存放的是java的基本變數和物件的引用 堆:存放的是物件或陣列,也就是new出來的物件。 int a = 9; 這裡a就是物件的引用,9就是基本變數 Perso
Java“按值傳遞”和“按引用傳遞”釋疑
在Java的說明書中,說明了Java是“按值傳遞(pass-by-value)”的,並不存在什麼“按引用傳遞(pass-by-reference)” 但是我們在一些部落格中,看到有說Java中既有“按值傳遞”,也有“按引用傳遞”,而且在我們的實際使用中,有些時候確實給我們感覺像是有時候在“
JAVA引數傳遞方式 (按值傳遞與引用傳遞區別)
首先要明確的是JAVA中沒有引用傳遞, 全部是按值呼叫 令大家所費解的 當物件引用作為引數時 函式為什麼能修改真實的物件呢?這不是引用傳遞的特徵嗎? 尤其先學習C++再學習JAVA的同學(比如說我自己)會這樣認為, 用白話解釋就是: 引用傳遞指標時, 連函式操作的指
詳解Java到底是“引用傳遞”還是“按值傳遞”?
Java始終是按值傳遞的。但是,我們通常將物件的位置稱為“引用”。當我們傳遞一個物件的值時,我們將引用傳遞給它。這對初學者來說很困惑。 我們可以通過兩個例子來看一下: 它是這樣的: public static void main(String[] args) { Dog aD
JAVA 方法的引數是按值傳遞還是引用傳遞?
在思考這個問題之前首先要明白JAVA一個類中的資料成員有多少種: JAVA一個類中資料成員只有兩種,分別是:基本資料型別和物件。基本資料型別就不用多說了,只有8種;其他的都是物件,JAVA class位元組碼檔案在記憶體中是一個靜態物件、
java方法引數傳遞方式--按值傳遞、引用傳遞
java的方法引數傳遞方式有兩種,按值傳遞和引用傳遞 1.按值傳遞 引數型別是int,long等基本資料型別(八大基本資料型別),引數傳遞的過程採用值拷貝的方式 程式碼片段1: public class Test { public static void m
深入理解--Java按值傳遞和按引用傳遞
引言 最近刷牛客網上的題目時碰到不少有關Java按值傳遞和按引用傳遞的問題,這種題目就是坑呀,在做錯了n次之後,查找了多方資料進行總結既可以讓自己在總結中得到提高,又可以讓其他人少走彎路。何樂而不為? Java按值傳遞和按引用傳遞 首先問一句:Is J
java中按值傳遞和引用傳遞區別
java中在引數傳遞時有2種方式, 一種是按值傳遞:值傳遞是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。簡單來說就是直接複製了一份資料過去,因為是直接複製,所以這種方式在傳遞時如果資料量非常大的話,執行