Java的方法參數傳遞是值傳遞仍是引用傳遞?對於基本類型和對象來講,都會發生什麼狀況?小程序
答案是Java只有值傳遞,由於Java只有值傳遞,所以在改變形參的值的時候,實參是不會所以而改變的。這一點從下面這個小程序能夠很明顯的看出來。.net
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只有值傳遞了,不管是對象仍是基本類型,改變形參的值不會反應到實參上面去,這也正是值傳遞的奧義所在。blog
對於基本類型來講,這一點比較明顯,不過對於對象來說,不少猿友會有誤解。認爲咱們在方法裏改變形參對象屬性的值,是會反映到實參上面去的,所以部分猿友認爲這就是引用傳遞。it
首先LZ要強調的是,上面也說了,咱們只是改變形參對象屬性的值,反映到實參上面去的,而不是真的改變了實參的值,也就是說實參引用的對象依然是原來的對象,只不過對象裏的屬性值改變了而已。io
針對上面這一點,咱們使用下面這個程序來講明。table
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,咱們來看一下結果。class
能夠看到,實參對象的值依然沒有改變,只是屬性值變了而已,所以這依舊是值傳遞的範圍。爲了說明這個區別,咱們來看下真正的引用傳遞。因爲Java當中不存在引用傳遞,所以LZ借用C/C++來讓各位看下真正的引用傳遞是什麼效果。object
#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