Java 将数组传递给方法示例毫无意义

Java 将数组传递给方法示例毫无意义,java,arrays,Java,Arrays,在我的java书中有一个示例程序对我来说毫无意义。基本上,它将数组引用传递给方法。但是结果是数组本身被修改了,即使该方法没有返回值,或者其中没有指示它除了创建自己的数组实例之外还执行其他操作的内容 public class PassArray { public static void main( String[] args ) { int[] array = { 1, 2, 3, 4, 5 }; System.out.println(

在我的java书中有一个示例程序对我来说毫无意义。基本上,它将数组引用传递给方法。但是结果是数组本身被修改了,即使该方法没有返回值,或者其中没有指示它除了创建自己的数组实例之外还执行其他操作的内容

public class PassArray 
{
   public static void main( String[] args )
   {
      int[] array = { 1, 2, 3, 4, 5 };

      System.out.println( 
         "Effects of passing reference to entire array:\n" +
         "The values of the original array are:" );

      for ( int value : array )
         System.out.printf( "   %d", value );

      modifyArray( array ); // pass array reference to method modifyArray
      System.out.println( "\n\nThe values of the modified array are:" );

      // output the value of array (why did it change?)
      for ( int value : array )
         System.out.printf( "   %d", value );

   } // end main

   // multiply each element of an array by 2 
   public static void modifyArray( int array2[] ) // so this accepts an integer array as an arguement and assigns it to local array array[2]
   {
      for ( int counter = 0; counter < array2.length; counter++ )
         array2[ counter ] *= 2;
   } // What hapened here? We just made changes to array2[] but somehow those changes got applied to array[]??? how did that happen?  

   //What if I wanted to not make any changes to array, how would implement this code so that the output to screen would be the same but the value in array would not change?

} // end class PassArray
公共类通道
{
公共静态void main(字符串[]args)
{
int[]数组={1,2,3,4,5};
System.out.println(
“将引用传递到整个数组的效果:\n”+
原始数组的值为:);
for(int值:数组)
System.out.printf(“%d”,值);
modifyArray(array);//将数组引用传递给方法modifyArray
System.out.println(“\n\n修改后数组的值为:”);
//输出数组的值(为什么会更改?)
for(int值:数组)
System.out.printf(“%d”,值);
}//末端总管
//将数组的每个元素乘以2
public static void modifyArray(int array2[])//因此它接受整数数组作为参数,并将其分配给本地数组[2]
{
用于(int计数器=0;计数器
请解释为什么会出现这种情况,以及如何以某种方式实现这种情况,从而不改变数组的值。

//这里发生了什么?我们刚刚对array2[]进行了更改,但不知怎的,这些更改被应用到了array2[]???那是怎么发生的

因为java是按引用值传递的。引用的副本将传递给方法。此引用仍然指向原始数组。对此引用执行的任何更改都将反映在原始数组中

如何以某种方式实现这一点,从而不改变数组的值

一种方法是,在方法内部创建新数组并将此引用分配给它

例如:

public static void modifyArray( int array2[] ) 
   {
      array2 = new int[10];
      //Copy only ten elements from outer array, which populates element at index 2.
      for ( int counter = 0; counter < array2.length; counter++ )
      array2[ counter ] *= 2;
   } 
publicstaticvoidmodifyarray(int-array2[])
{
array2=新整数[10];
//仅从外部数组复制十个元素,外部数组填充索引2处的元素。
用于(int计数器=0;计数器
现在,对该引用执行的更新/操作将影响在方法内创建的新数组,而不是原始数组

有关更多信息,请参见此

//这里发生了什么?我们刚刚对array2[]进行了更改,但不知怎的,这些更改被应用到了array2[]???那是怎么发生的

因为java是按引用值传递的。引用的副本将传递给方法。此引用仍然指向原始数组。对此引用执行的任何更改都将反映在原始数组中

如何以某种方式实现这一点,从而不改变数组的值

一种方法是,在方法内部创建新数组并将此引用分配给它

例如:

public static void modifyArray( int array2[] ) 
   {
      array2 = new int[10];
      //Copy only ten elements from outer array, which populates element at index 2.
      for ( int counter = 0; counter < array2.length; counter++ )
      array2[ counter ] *= 2;
   } 
publicstaticvoidmodifyarray(int-array2[])
{
array2=新整数[10];
//仅从外部数组复制十个元素,外部数组填充索引2处的元素。
用于(int计数器=0;计数器
现在,对该引用执行的更新/操作将影响在方法内创建的新数组,而不是原始数组


有关详细信息,请参见此。

当您将数组传递给方法时,实际上只是将引用的副本传递给数组

对数组所做的任何更改都将反映在传递的对象中


实际上传递给modifyArray的是数组引用的副本,这就是为什么人们说Java是“按引用值传递”。

当您将数组传递给方法时,实际上只是将引用的副本传递给数组

对数组所做的任何更改都将反映在传递的对象中

实际上传递给modifyArray的是数组引用的副本,这就是为什么人们说Java是“按引用值传递”的原因 { 公共静态void main(字符串[]args) { int[]数组={1,2,3,4,5}; System.out.println( “将引用传递到整个数组的效果:\n”+ 原始数组的值为:); for(int值:数组) System.out.printf(“%d”,值); modifyArray((int[])array.clone(););//将数组引用传递给方法modifyArray System.out.println(“\n\n修改后数组的值为:”); //输出数组的值(为什么会更改?) for(int值:数组) System.out.printf(“%d”,值); }//末端总管 //将数组的每个元素乘以2 public static void modifyArray(int array2[])//因此它接受整数数组作为参数,并将其分配给本地数组[2] { 用于(int计数器=0;计数器 请阅读此文以更好地理解公共类PassArray { 公共静态void main(字符串[]args) { int[]数组={1,2,3,4,5}; System.out.println(
  public static int[] modifyArray( int array[] )
  {
      int length = array.length; // length of the original array
      int array2[] = new int[length]; // the new array which we will copy the data into
      System.arraycopy(array, 0, array2, 0, length); // now we copy the data from array[] into array2[]
      for ( int counter = 0; counter < array2.length; counter++ ) {
          array2[ counter ] *= 2; // multiply by 2
      }

      return array2; // return the array with the new values
  }