Java的方法參數傳遞是值傳遞還是引用傳遞?對於基本類型和對象來說,都會發生什麼情況?
答案是Java只有值傳遞,因爲Java只有值傳遞,因此在改變形參的值的時候,實參是不會因此而改變的。這一點從下面這個小程序可以很明顯的看出來。
public class Main { public static void main(String[] args) { int a = 2; Object object = new Object(); System.out.println(a + ":" + object); change(a, object); System.out.println(a + ":" + object); } public static void change(int a,Object object){ a = 1; object = new Object(); } } |
我們在方法當中改變形參的值,之後再次輸出兩個實參的值,會發現它們無任何變化。
這就足以說明Java只有值傳遞了,無論是對象還是基本類型,改變形參的值不會反應到實參上面去,這也正是值傳遞的奧義所在。
對於基本類型來說,這一點比較明顯,不過對於對象來講,很多猿友會有誤解。認爲我們在方法裏改變形參對象屬性的值,是會反映到實參上面去的,因此部分猿友認爲這就是引用傳遞。
首先LZ要強調的是,上面也說了,我們只是改變形參對象屬性的值,反映到實參上面去的,而不是真的改變了實參的值,也就是說實參引用的對象依然是原來的對象,只不過對象裏的屬性值改變了而已。
針對上面這一點,我們使用下面這個程序來說明。
public class Main { public static void main(String[] args) { int a = 2; Entity entity = new Entity(); entity.a = 100; System.out.println(a + ":" + entity); System.out.println(entity.a); change(a, entity); System.out.println(a + ":" + entity); System.out.println(entity.a); } public static void change(int a,Entity entity){ a = 1; entity.a = 200; } } class Entity{ int a; } |
我們在方法裏改變了entity對象的屬性值爲200,我們來看一下結果。
可以看到,實參對象的值依然沒有改變,只是屬性值變了而已,因此這依舊是值傳遞的範圍。爲了說明這個區別,我們來看下真正的引用傳遞。由於Java當中不存在引用傳遞,因此LZ借用C/C++來讓各位看下真正的引用傳遞是什麼效果。
#include <stdio.h> class Entity{ public: int a; Entity(){}; }; void change(int &a,Entity *&entity); int main(){ int a = 2; Entity *entity = new Entity(); printf("%d:%p\n",a,entity); change(a, entity); printf("%d:%p\n",a,entity); } void change(int &a,Entity *&entity){ a = 1; entity = new Entity(); } |
儘量保持和Java的第一個程序是一樣的結構,只不過C/C++中沒有現成的Object對象,因此這裏使用Entity對象代替,這樣便於各位理解。我們來看下結果,結果會發現引用傳遞的時候,在方法裏改變形參的值會直接反應到實參上面去。
原文作者(左瀟龍)鏈接:https://blog.csdn.net/zuoxiaolong8810/article/details/65441606