Java的方法參數傳遞是值傳遞還是引用傳遞

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章