>  기사  >  Java  >  Java에 참조 전송이 있는지 분석

Java에 참조 전송이 있는지 분석

零到壹度
零到壹度원래의
2018-03-19 09:53:181547검색

Java에서 함수를 호출할 때 참조 전달이 있는지에 대해 다양한 의견이 있었습니다. 어떤 사람들은 Java에는 가치 전달만 있다고 하고, 어떤 사람들은 Java에 가치 전달과 참조 전달이 모두 있다고 말합니다. 그러면 Java에는 참조 전달이 있습니까?

값 전달: 전달된 매개변수의 복사본입니다. 매개변수의 수정은 복사본의 수정일 뿐이며, 복사본은 삭제되고 원래 변수는 변경되지 않습니다(즉, 실제 매개변수). 변경되지 않음)

참조 전달: 매개변수가 함수에 전달되면 복사본이 만들어지지 않지만 매개변수 자체는 함수 내에서 매개변수에 대한 모든 변경 사항이 원래 변수에 반영됩니다. .

C++과 Java 모두 참조라는 개념을 가지고 있지만 두 언어에서는 완전히 다른 의미를 갖습니다. C++에서는 "int &b=a" 형식을 사용하여 변수 a의 참조 b를 정의할 수 있습니다. b는 a의 별칭일 뿐이며 a는 참조 메커니즘을 사용하여 호출할 수 있습니다. 함수는 값의 양방향 전송, 즉 참조에 의한 전송을 구현합니다. 다음 코드를 참조하세요.

 
 示例一 
     #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值传递和引用传递进行的区别"的文章,如果读者看到的话一定要清楚,其中所说的引用传递是不正确的,他们所说的引用传递就是示例二中的那种情况。不幸的是,网上有很多文章都把示例二中的那样的传递看做引用传递,如果读者看到知道是什么意思就行了。

위 내용은 Java에 참조 전송이 있는지 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.