1. 程式人生 > >什麼是值傳遞和引用傳遞?之間的區別

什麼是值傳遞和引用傳遞?之間的區別

一般認為,java內的基礎型別資料傳遞都是值傳遞. java中例項物件的傳遞是引用傳遞。值傳遞是對基本型變數而言的,傳遞的是該變數的一個副本,改變副本不影響原變數。引用傳遞一般是對於物件型變數而言的,傳遞的是該物件地址的一個副本, 並不是原物件本身 。

首先,不要糾結於 Pass By Value 和 Pass By Reference 的字面上的意義,否則很容易陷入所謂的“一切傳引用其實本質上是傳值”這種並不能解決問題無意義論戰中。
更何況,要想知道Java到底是傳值還是傳引用,起碼你要先知道傳值和傳引用的準確含義吧?可是如果你已經知道了這兩個名字的準確含義,那麼你自己就能判斷Java到底是傳值還是傳引用。
這就好像用大學的名詞來解釋高中的題目,對於初學者根本沒有任何意義。

一:搞清楚 基本型別 和 引用型別的不同之處

int num = 10;
String str = "hello";

圖片說明

如圖所示,num是基本型別,值就直接儲存在變數中。而str是引用型別,變數中儲存的只是實際物件的地址。一般稱這種變數為"引用",引用指向實際物件,實際物件中儲存著內容。

二:搞清楚賦值運算子(=)的作用

num = 20;
str = "java";

對於基本型別 num ,賦值運算子會直接改變變數的值,原來的值被覆蓋掉。
對於引用型別 str,賦值運算子會改變引用中所儲存的地址,原來的地址被覆蓋掉。但是原來的物件不會被改變(重要)。
如上圖所示,"hello" 字串物件沒有被改變。(沒有被任何引用所指向的物件是垃圾,會被垃圾回收器回收)
圖片說明


三:呼叫方法時發生了什麼?引數傳遞基本上就是賦值操作。
第一個例子:基本型別

void foo(int value) {
    value = 100;
}
foo(num); // num 沒有被改變

第二個例子:沒有提供改變自身方法的引用型別

void foo(String text) {
    text = "windows";
}
foo(str); // str 也沒有被改變

第三個例子:提供了改變自身方法的引用型別

StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder.append("4");
}
foo(sb); // sb 被改變了,變成了"iphone4"。

第四個例子:提供了改變自身方法的引用型別,但是不使用,而是使用賦值運算子。

StringBuilder sb = new StringBuilder("iphone");
void foo(StringBuilder builder) {
    builder = new StringBuilder("ipad");
}
foo(sb); // sb 沒有被改變,還是 "iphone"。

重點理解為什麼,第三個例子和第四個例子結果不同?

下面是第三個例子的圖解:
圖片說明
builder.append("4")之後
圖片說明
下面是第四個例子的圖解:
圖片說明
builder = new StringBuilder("ipad"); 之後
圖片說明

相關推薦

什麼是傳遞引用傳遞之間區別

一般認為,java內的基礎型別資料傳遞都是值傳遞. java中例項物件的傳遞是引用傳遞。值傳遞是對基本型變數而言的,傳遞

傳遞引用傳遞(不是引用類型的傳遞)的區別

com this static 實現 pre 對象 ffffff -c wap 值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參數的值。引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中

傳遞引用傳遞區別

1. 這裡還有一個 例子就是 String,String他就相當於 值傳遞,其實他是 重新建立了堆中的記憶體地址:這哥們說的是: https://blog.csdn.net/party3/article/details/78648186 今天上班時,同事發現了一個比較有意思的問題。他把一個String型

java中的傳遞引用傳遞有什麼區別呀?

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

java中的傳遞引用傳遞有什麽區別呀?

地址 system main方法 demo ring brush 執行 相關 變量 值傳遞: (形式參數類型是基本數據類型和String):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存

PHP_Day02_變數_傳遞引用傳遞區別

<?php /* 介紹:變數的賦值,值傳遞和引用傳遞的區別 作者:趙某~ 實踐:2018/11/4 */ // 值傳遞 $var1 = 'php'; # 定義兩個變數 $var2 = 'C++'; $var1 = $var2; # 賦值

Python中傳遞引用傳遞區別

python中對一個函式可以傳遞引數,但是如何分辨是值傳遞還是引用傳遞,不是程式設計師手動控制的,而是python根據你傳入的資料物件,自動識別的。 如果你傳入的引數物件是可變物件:列表,字典,這個時候就是引用傳遞,如果引數在函式體內被修改,那麼源物件也會被修改。 如果你傳

大歐陽在java 實參與形參還有傳遞引用傳遞之間的理解

一、實參和形參先扯一段程式碼public static void swap(int a,int b) { int tmp = a; a = b; b = tmp; System.out.println("

客觀面試題--16.傳遞引用傳遞區別?JavaScript的資料型別都有什麼?

關於值傳遞和引用傳遞其實需要分情況看待.1.基本型別和引用型別在記憶體中的儲存Java中資料型別分為兩大類,基本型別和物件型別。相應的,變數也有兩種型別:基本型別和引用型別。基本型別的變數儲存原始值,即它代表的值就是數值本身;而引用型別的變數儲存引用值,"引用值"指向記憶體空

什麼是 傳遞,地址傳遞引用傳遞 有什麼區別

什麼是值傳遞,地址傳遞和引用傳遞?它們有什麼不同?這在學校考試,找工作面試中都是常見的問題。它們之間的區別容易搞錯,長時間不用也容易忘記。最近又被問到這個問題,想想還是整理一下記下來,也方便以後參考。 首先,看以下三段程式碼。 1.  void swap1(i

PHP傳遞引用傳遞區別。什麼時候傳什麼時候傳引用

(1)按值傳遞:函式範圍內對值的任何改變在函式外部都會被忽略 (2)按引用傳遞:函式範圍內對值的任何改變在函式外部也能反映出這些修改 (3)優缺點: A:按值傳遞時,php必須複製值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。 B.按引用傳遞則

C++中傳遞引用傳遞區別

    最近補資料結構和演算法時,捎帶著學了些C++,剛好看到一篇關於值傳遞和引用傳遞的文章,收穫頗豐,這裡分享一下學習心得,當然,C#中也差不多。     C++中引數的傳遞方式: 1.值傳遞     呼叫時,將實參的值傳遞對應的形參,即為值傳遞。由於形參有自己獨立的儲存

java中按傳遞引用傳遞區別

java中在引數傳遞時有2種方式,         一種是按值傳遞:值傳遞是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。簡單來說就是直接複製了一份資料過去,因為是直接複製,所以這種方式在傳遞時如果資料量非常大的話,執行

C++函數的三種傳遞方式為:傳遞、指針傳遞引用傳遞

否則 方式 指針 指向 out 數據結構 logs 形參 使用 C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞 值傳遞: void fun(int x){ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開辟的一塊臨時空間把y

傳遞引用傳遞

如何 nth value 引用 static st2 值傳遞 pack 修改方法 在java中如何修改方法參數的值 答案是 package myapp; import org.omg.CORBA.IntHolder; public class Test2 { pu

Java 傳遞引用傳遞

too log test img [0 st3 tle class cnblogs 引用傳遞 示例: public class Test3 { public static void change(int []a){ a

JAVA中的傳遞引用傳遞問題

log 輸出結果 基礎知識 blue static 繼續 oid .net red   這是個老生常談的問題了,引起過無數爭論,但可以說一直沒有一個令人滿意的回答。   有人總結過: 對象是按引用傳遞的 Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞

JavaScript傳遞引用傳遞

類型 遞歸 boolean 簡單 java 另一個 obj 簡單的 兩個 1?數據類型:boolean,null,undefined,String,Number,指向包含的數據,進行“值傳遞”; 2、非數據類型:Array,Function,Obj

15. 傳遞引用傳遞

args tel write oat 函數 fun sub 參數 name 一、值傳遞和引用傳遞    1、什麽是值傳遞?   答:值傳遞是指在調用函數時將實際參數(實參)復制一份傳遞到函數中,系統將為目標對象重新開辟一個完全相同的內存空間。這樣在函數中如果對參數進行修改,

java中傳遞引用傳遞

public 例子 oar 是什麽 sta light 修改 [] 重要 1:按值傳遞是什麽 指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。示例如下: [java] view plain copy public class TempTest { private