2014-01-23 31 views
0

当我运行这段代码,它打印0,1,2,但我不知道为什么。你能解释我吗?阵列和错误的印刷

public void run() { 
     int[] arr = new int [3]; 
     for(int i=0; i<arr.length;i++){ 
      arr[i]=i; 
     } 
     domore(arr); 
     for(int i=0; i<arr.length;i++){ 
      println(arr[i]); 
     } 
    } 

    private void domore(int[] arr) { 
     // TODO Auto-generated method stub 
     int [] att = new int [3]; 
     for(int i=0; i<att.length;i++){ 
      att[i]=77; 
     } 
     arr=att; 
    } 
+0

使用'arr = att;'您只是将引用的本地副本重新分配给数组。 Google传值与传递引用。 – blgt

回答

0

你逝去的任何参数值功能,该范围将是本地的只是功能。

而另一件事是,在java中您呼叫的价值没有被引用的函数。

如果你想使用修改后的值,你从函数必须return这一点。

public void run() { 
      int[] arr = new int [3]; 
      for(int i=0; i<arr.length;i++){ 
       arr[i]=i; 
      } 
      // arr is in run() method 
      domore(arr); 
      for(int i=0; i<arr.length;i++){ 
       System.out.println(arr[i]); 
      } 
     } 

     private void domore(int[] arr) { 
      // TODO Auto-generated method stub 
      int [] att = new int [3]; 
      for(int i=0; i<att.length;i++){ 
       att[i]=77; 
      } 
      arr=att; // here scope of arr is local for domore() method only 
      // so arr in run() method will not modified. 
     } 
8

在Java中 - “对对象的引用通过值传递”。您在doMore()方法中所做的任何更改都不会反映到原始数组中,因为您正在重新分配所传递的引用......(请使用camelCase命名方法/字段,即使用doMore()而不是domore)。

public void run() { 
     int[] arr = new int [3]; // arr points to an integer array of size 3 
     doMore(arr); 
     } 
private static void doMore(int[] arrNew) { // arrNew is copy of arr so it also points to the same integer array of size 3. So, any changes made by arrNew are as good as changes made by arr (and yes data of arr is changed..)   
     // TODO Auto-generated method stub 
     int [] arrNew = new int [3];   // you are making arrNew point to new integer array of size 3. So, now arrNew points to a new object and not to the one pointed by arr. 
     for(int i=0; i<arrNew.length;i++){ 
      arrNew[i]=77; 
     } 

    } 
+0

但如果我用“doMore”方法编写arr [1] = 33;它会改变! – user3151874

+0

@ user3151874这是因为通过了引用的副本。这意味着对作为参数传递的对象所做的更改将影响初始引用。但是,为该引用分配新的引用不会影响传入该方法的引用。请参阅:http://www.javaranch.com/campfire/StoryPassBy.jsp –

+0

@ user3151874 - 检查我编辑的答案.. – TheLostMind

3

在该方法domoreint[] arr作为参数被传递,这意味着参考的副本被传递(又名由值)。在该方法中,创建一个新的int[],然后将其分配给参考副本(int[] arr)。这绝不会改变在run方法中创建的初始int[]。它只会将传递的参数分配给domore()中新创建的数组。

1

因为你把你的arr - 阵列的参考方法domore。在它里面,你可以通过设置arr=att来减少这个参考。外方法run是无法识别这个新设置的基准,并会留在旧的数组引用,你已经把值0, 1, 2

0

domore是一个void函数。如果你不想改变你的价值观,你将不得不返还一些东西。

private int[] domore (int[] arr){ 
int [] att = new int [3]; 
    for(int i=0; i<att.length;i++){ 
     att[i]=77; 
    } 
    return att; 
} 

你叫它是:

arr = domore(arr); 
+0

您只需在方法参数“arr”中设置值。因为外部方法有这个参考! – bobbel

1

尝试在domode方法返回数组ARR

public void run() { 
    int[] arr = new int [3]; 
    for(int i=0; i<arr.length;i++){ 
     arr[i]=i; 
    } 
    arr = domore(arr); 
    for(int i=0; i<arr.length;i++){ 
     println(arr[i]); 
    } 
} 

private int[] domore(int[] arr) { 
    // TODO Auto-generated method stub 
    int [] att = new int [3]; 
    for(int i=0; i<att.length;i++){ 
     att[i]=77; 
    } 
    return(att); 
} 
+0

有写无效,你返回int [] – user3151874

+0

是的,你是对的,我纠正它。 –

0

您与原语的数组工作。如果您将int更改为Integer(从基元到对象),您不应该有这个问题。

int a=5; 
int b=a; 
b=10; 

- >一仍将5. 如果你想使用原语,然后就返回int数组,并将其分配到初始阵列

arr=doMore(arr); 
-1

使用 ARR =(INT [ ])att.clone();或者你也可以使用Array.copyOf方法!

代替ARR = ATT

+0

这并不能解决问题,因为引用仍然会保存带有元素'0,1,2'的数组! – bobbel

+0

@bobble ......我以为他想改变数组的内容。 –

+0

这是真的!但是......如果你用'domore'方法克隆数组,这个问题没有什么好处。在'run'方法中,'arr'变量仍然保持对包含'0,1,2'的数组的引用。 – bobbel