解决方案 »

  1.   

    你在main里面定义a[]的时候加上static试试
      

  2.   

    你要明白,你传的不是数组,是数组首地址的拷贝。函数在java中叫方法。方法的传值都是值传递,就是将传进来的东西拷贝一份。你传过来一个数组,实际上内存只是创建了数组首地址的拷贝。这个拷贝指向该数组。你insert方法里,所作的修改,实际上也只是操作两个数组的首地址。
      

  3.   

    将insert()改为有返回值,并将返回值重新赋给a[],修改如下:
    public class ArrayInsert {
    public static void main(String[] args) 
        {
            int[] a={1,2,3,4,5,6,7,8,9};
              a=insert(a,3,666);
            printArray(a);//输出1,2,3,4,5,6,7,8,9、、、、为什么呢?
            //不是在前面insert中已经变了么?
        }
        public  static int[] insert(int[] a,int position,int num)
        {
            int len=a.length;
            int[] b=new int[len+1];
            for(int i=0;i<a.length;i++)
                b[i]=a[i];
            a=b;//扩容
            for(int i=len;i>position;i--)
            {
                a[i]=a[i-1];
            }
            a[position]=num;
            printArray(a);//输出1,2,3,666,4,5,6,7,8,9
            return a;
        }
        public static void printArray(int[] a)//打印数组
        {
            for(int i=0;i<a.length;i++)
                System.out.println(a[i]+"  ");
            System.out.println();
        }
    }结果:1  2  3  666  4  5  6  7  8  9  
    1  2  3  666  4  5  6  7  8  9  
      

  4.   

    a只是数组的一个引用,真正数据是储存在别的地方的。你在insert函数里面传递的也只是数组的引用,但是你在insert函数里面重新创建了一个b数组,a=b只是将a指向了b数组,a数组原来指向的数据是没有改变的。也就是main函数里面的a和insert函数里面的a指向的已经不是同一个数组了
      

  5.   

    数组名作参数应该是地址传递,正因为会不同,是由于在insert中将a的地址指向了b的地址(a=b),如果将这段去掉,那么,在insert中修改a数组中某位置的元素,在原来的a数组相对应位置的元素也会产生相对应的改变。
      

  6.   

    insert里的a不是main里的a,它们只是两个相等的东西
      

  7.   

    值传递和地址传递的问题,
    分析Java对象的引用和地址的关系,理解地址
      

  8.   

    你好 在你的程序里 insert 方法里面a和b两个int型数组引用都指向了新开辟的一块儿内存 也就是int[a.length + 1]. 因为java是按值传递 无法在方法内改变外部传入参数的值 (除了对象引用) 你可以把你的方法返回值类型改为int[] 返回一个改变后的引用public static int[] insert(int[] a,int position,int num)
        {
            int len=a.length;
            int[] b=new int[len+1];
            for(int i=0;i<a.length;i++)
                b[i]=a[i];
            a=b;//扩容
            for(int i=len;i>position;i--)
            {
                a[i]=a[i-1];
            }
            a[position]=num;
            return a;
        }public static void main(String[] args)
        {
            int[] a={1,2,3,4,5,6,7,8,9};
            int[] b = insert(a,3,666);
            printArray(b);
    //输出1,2,3,4,5,6,7,8,9、、、、为什么呢?
            //不是在前面insert中已经变了么?
        }希望有帮助
      

  9.   

    2次不一样?
    估计楼主的第二次是在main里输出的,insert方法中改变a=b中b是新数组对象,是把局部变量a指向新数组b,外面的变量a仍然指向原来的数组对象.
      

  10.   

    楼主在insert方法里又声明了一个新的数组,之后在新的数组上进行操作却没有返回这个新的数组的引用给方法调用者。
    所以原来的数组引用a还是指向原来的堆内存空间,新声明的数组b在方法结束时也就成为了“垃圾”等待着被回收。此时楼主应该将新声明的数组的引用返回给方法调用处。 public static void insert(int[] a,int position,int num)
        {
            int len=a.length;
            int[] b=new int[len+1];
            for(int i=0;i<a.length;i++)
                b[i]=a[i];
            a=b;//扩容   --- 此处只不过是临时的而已
            for(int i=len;i>position;i--)
            {
                a[i]=a[i-1];
            }
            a[position]=num;
            printArray(a);//输出1,2,3,666,4,5,6,7,8,9
        }
      

  11.   

    传进去的是a,后来你又new了一个b,你将b的地址值给了a,也就是你所说的扩容,这里a就不跟原先数组a的地址一样了,也就是说是两个不同的对象,而你后来调用的a就是你首先定义的那个数组,这是因为方法里的a定义域在方法中,你原先的数组a正好定义在你调用的那个定义域
      

  12.   

    每次遇到这种问题,总有一些不懂装懂在上面回复误人子弟,自己没理解清楚,还说那么多。
    楼主你把a=b这个去掉看看。本来insert方法里是可以改变main方法里数组a的值的,但是你先把a指向b了,这样改变a 改变的就是数组b
      

  13.   

     public static void main(String[] args) 
        {
            int[] a={1,2,3,4,5,6,7,8,9};
            insert(a,3,666);
            printArray(a);//输出1,2,3,4,5,6,7,8,9、、、、为什么呢?
            //不是在前面insert中已经变了么?
        }
    你输出的那个a是 你定义的那个a数组 虽然你的insert方法将a改变 但是你并没有返回回来并且给以上a赋值  所以输出的肯定还是原来的数组哇  这样说能懂不呢
      

  14.   

    Java只有,值传递!! 只有C++才有引用传递
      

  15.   

    a=b,insert方法中的a变量已经指向了b数组,与main中的a不是指向同一块地址。所以在insert方法中插入666,不会对main方法中的a变量造成影响。