Maison  >  Article  >  Java  >  Analyser s'il existe un transfert de référence en Java

Analyser s'il existe un transfert de référence en Java

零到壹度
零到壹度original
2018-03-19 09:53:181544parcourir

Il y a eu différentes opinions sur la question de savoir s'il y a un passage de référence lors de l'appel de fonctions en Java. Certaines personnes disent que Java n'a qu'un transfert de valeur, tandis que d'autres disent que Java a à la fois un transfert de valeur et un transfert de référence. Alors, existe-t-il un transfert de référence en Java ?

Transfert de valeur : une copie des paramètres passés est effectuée. La modification des paramètres n'est qu'une modification de la copie. Lorsque l'appel de la fonction se termine, la copie est supprimée et les variables d'origine restent inchangées (c'est-à-dire). , les paramètres réels restent inchangés)

Passage par référence : lorsque des paramètres sont transmis à une fonction, aucune copie n'est effectuée, mais les paramètres eux-mêmes sont directement transmis à la fonction. Toute modification des paramètres à l'intérieur. la fonction sera reflétée dans les variables d'origine.

C++ et Java ont tous deux le concept de référence, mais ils ont des significations complètement différentes dans ces deux langages. En C++, nous pouvons utiliser la forme "int &b=a" pour définir une référence b de variable a. b est juste un alias de a et a occupe la même unité de stockage en mémoire, nous pouvons appeler. Les fonctions implémentent un transfert de valeurs bidirectionnel, c'est-à-dire un transfert par référence. Voir le code suivant :

 
 示例一 
     #include <iostream> 
     using namespace std;
     int main() 
     {   void swap(int &,int &);
       int i=3,j=5; 
         swap(i,j); 
            cout<<"i="<<i<<"j="<<j<<endl; 
               return 0; 
               } void swap(int &a,int &b)
                 { int temp;
                   temp=a; 
                     a=b;  b=temp;  }
  执行上面的程序输出的是i=5 j=3,a和b传递给swap()函数的时候,是传递的他们本身的地址,不是他们的拷贝,所以在函数中对他们的改变可以直接影响到实参a和b,这就是引用传递。 java中的引用更像C++中的指针,当我们定义一个对象时(比如Person p=new Person()),定义的对象实例会放到java堆中,而变量p(即引用)会放到java栈中,p指向堆中的Person对象实例。
    
    为什么有很多人认为java有引用传递呢?一种情况是有人认为调用函数时其参数有可能是引用(如上面的p),所以java有引用传递,这部分人对引用传递根本没有正确的认识;而另一种情况看似有道理,但是仔细分析也是不正确的的,他们往往会用如下的代码来证明他们的观点: 
    实例二:
    复制代码 class Demo{  
       int a;  
       public Demo(int a){  
           this.a=a;  
       }  
   }  
   public class TestQuote{  
       public static void main(String args[]){  
           Demo d1=new Demo(1);  
           Demo d2=new Demo(2);  
           System.out.println(d1.a);  
           System.out.println(d2.a);  
           function(d1,d2);  
           System.out.println(d1.a);  
           System.out.println(d2.a);  
       }  
       private static void function(Demo d1,Demo d2){  
           int a;  
          a=d1.a;  
           d1.a=d2.a;  
           d2.a=a;  
       }  
   }  
  复制代码 
   他们的观点如下:执行上面的代码,调用function()函数以前输出的结果是1、2,调用function()函数之后输出的结果会是2、1,可见在函数内对d1和d2的改变反映到了原来的变量上,要不是不会输出2、1的。  这种解释是很迷惑人的,看上去好像很正确,下面的代码会很好的反驳上面的观点:
    示例三:
     复制代码  class Demo{  
       int a;  
      public Demo(int a){  
           this.a=a;  
       }  
   }  
   public class TestQuote{  
      public static void main(String args[]){  
          Demo d1=new Demo(1);  
          Demo d2=new Demo(2);  
          System.out.println(d1.a);  
          System.out.println(d2.a);  
          function(d1,d2);  
          System.out.println(d1.a);  
          System.out.println(d2.a);  
      }  
      private static void function(Demo d1,Demo d2){  
          Demo temp;  
          temp=d1;  
          d1=d2;  
          d2=temp;  
      }  
  } 
   执行上面的代码,调用function()前后程序输出的都是1、2,此程序试图通过调用function()交换d1和d2,但是没有成功,为什么呢?因为d1和d2是值传递,function()中的d1和d2是main()函数中d1和d2的副本,调用完function()不会对main()中的变量产生影响。再看示例二中,function()函数内改变的并不是d1和d2本身的值,而是d1和d2指向的对象的值,调用完function()后d1和d2仍然指向函数调用前的堆地址,即函数参数是栈中的d1和d2,而不是堆中d1和d2指向的对象,即使你在函数中改变了堆中的对象,但没有改变函数参数的值。所以示例二并不是什么引用传递;可见java中只有值传递。
   但是网上有很多针对"java值传递和引用传递进行的区别"的文章,如果读者看到的话一定要清楚,其中所说的引用传递是不正确的,他们所说的引用传递就是示例二中的那种情况。不幸的是,网上有很多文章都把示例二中的那样的传递看做引用传递,如果读者看到知道是什么意思就行了。
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn