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

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

相關文章
相關標籤/搜索