class   ArrayArgument{ public   static   void   main(String   args[]){ 
        int   x[]={11,12,13,14,15}; 
        display(x); 
        change(x); 
        display(x); 
        } 
        public   static     void   change(int   x[]){ 
                int   y[]={21,22,23,24,25}; 
                                  x=y; 
                                  
              } 
      
        public   static   void   display(int   x[]){ 
                for(int   i=0;i <x.length;i++) 
                System.out.print(x[i]); 
                System.out.println( " "); 
                } 

运行结果:   11,12,13,14,15 
                    11,12,13,14,15 
数组,对象,和接口都属于引用类型 
把数组作为参数传递,传过去的只是它的一个引用,把这个引用指向新的数组,对原数组没有改变 
如果程序做些变动:将 
                                  x=y;   改成for(int   i=0;i <x.length;i++) 
                                                            x[i]=y[i]               
                                则运行结果变为:   11,12,13,14,15 
                                                                21,22,23,24,25 这是为什么?想不通

解决方案 »

  1.   

    原因很简单,Java 没有传引用只用传值~~~你所谓的传引用实际上传的是引用的拷贝
      

  2.   


    class ArrayArgument{  public static void main(String args[]){  
      int x[]={11,12,13,14,15};  
      display(x);  
      change(x);  
      display(x);  
      }  
      public static void change(int x[]){  //这里传的是一个int数组的引用x
      int y[]={21,22,23,24,25};  
      x=y;                   //改变的只是一个int[]类型的引用x,没有改变x之前引用的对象
        
      }  
        
      public static void display(int x[]){  
      for(int i=0;i <x.length;i++)  
      System.out.print(x[i]);  
      System.out.println( " ");  
      }  
    }  
      

  3.   

    如果说是 传的是引用的拷贝
    为什么对引用的拷贝做以下操作:
    x=y; 改成for(int i=0;i <x.length;i++)  
      x[i]=y[i]   
      则运行结果变为: 11,12,13,14,15  
      21,22,23,24,25  
    这是为什么?
      

  4.   

    x=y 只是把引用"x"指向 引用"y"所指的对象 , 执行到这时 方法change(int[] x) 中的"x" 和 main()方法中的"x" 已经指向两个不同的对象x[i]=y[i] 是进行赋值操作 方法change(int[] x) 中的"x" 和 main()方法中的"x" 一直是指向同一个对象
      

  5.   

    这个问题在csdn里貌似已经有N多帖子了。个人观点是:数组名的作用就类似于指针(当然java里是没有c和c++里那样全能的指针的),指出数组元素所在的内存地址。
      public static void change(int x[]){ 
      int y[]={21,22,23,24,25}; 
      x=y;  
      }
    调用这个方法的时候,会创建一个新的变量x(不同于传入的数组名x),它指向你传入的那个数组的地址,楼主的源码里它是指向{11,12,13,14,15}这个数组的。执行 x=y;后,它指向了{21,22,23,24,25}。而main()中的x仍然指向{11,12,13,14,15}.
    而当执行  x[i]=y[i];时;是将y[i]的值写入x[i]所在的内存空间。
    建议楼主了解一下java程序运行时的内存分配情况,马士兵的java培训视频里有几节是介绍这个的