本文目錄一覽:
- 1、值傳遞和引用傳遞,java到底按什麼傳遞的
- 2、java 值傳遞 引用傳遞???
- 3、java 值傳遞 例子
- 4、java對象如何做到值傳遞
- 5、為什麼說Java中只有值傳遞
- 6、JAVA 數值傳遞
值傳遞和引用傳遞,java到底按什麼傳遞的
java也分為值傳遞和引用傳遞
(1)基本數據類型傳值,對形參的修改不會影響實參;
(2)引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象;
(3)String, Integer, Double等immutable的類型特殊處理,可以理解為傳值,最後的操作不會修改實參對象。
java 值傳遞 引用傳遞???
值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。
引用傳遞:(形式參數類型是引用數據類型參數):也稱為傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式參數的改變將會影響實際參數。
java 值傳遞 例子
你是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#傳遞的實際是二級指針,它的內容是棧中的變數的地址)。
java對象如何做到值傳遞
您好:
Java中參數的傳遞方式有兩種:傳值和傳引用。按值傳遞(call by value)表示方法接受的是調用者提供的值;按引用調用(call by reference)表示方法接受的是調用者提供的變數地址。
傳值,參數為基本類型時,是採用傳值的方式,示例如下:
傳引用,一般參數為對象類型,示例如下:
以上,供參考,希望對你有幫助!
為什麼說Java中只有值傳遞
Java中其實還是值傳遞的,只不過對於對象參數,值的內容是對象的引用。
無論是值傳遞還是引用傳遞,其實都是一種求值策略(Evaluation strategy)。在求值策略中,還有一種叫做按共享傳遞(call by sharing)。其實Java中的參數傳遞嚴格意義上說應該是按共享傳遞。
按共享傳遞,是指在調用函數時,傳遞給函數的是實參的地址的拷貝(如果實參在棧中,則直接拷貝該值)。在函數內部對參數進行操作時,需要先拷貝的地址尋找到具體的值,再進行操作。如果該值在棧中,那麼因為是直接拷貝的值,所以函數內部對參數進行操作不會對外部變數產生影響。如果原來拷貝的是原值在堆中的地址,那麼需要先根據該地址找到堆中對應的位置,再進行操作。因為傳遞的是地址的拷貝所以函數內對值的操作對外部變數是可見的。
簡單點說,Java中的傳遞,是值傳遞,而這個值,實際上是對象的引用。
而按共享傳遞其實只是按值傳遞的一個特例罷了。所以我們可以說Java的傳遞是按共享傳遞,或者說Java中的傳遞是值傳遞。
JAVA 數值傳遞
常用變數傳遞:
你是指常量傳遞還是變數傳遞?
首先,JAVA也是按值傳遞的,看其值類型,
如果是
基本類型的,如
int,
float,double等基本類型,傳遞的是值;如果類型是引用類型,那麼傳遞的是值的引用(相當於C的指針),;
另外常量是在防在靜態常量池裡的,也是要看常量值的類型。
int
a=6;
傳遞的是值6;
引用變數傳遞時,傳遞的是引用地址;
String
name
=
“jim”
,傳遞的是”jim「
這個字元串常量的引用地址。
原創文章,作者:A757V,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/130630.html