为什么for循环可以在Java中初始化通过值传递的变量

为什么for循环可以在Java中初始化通过值传递的变量,java,oop,for-loop,reference,Java,Oop,For Loop,Reference,代码: 结果打印值为: import java.util.Arrays; class Heapify { int[] array; Heapify (int[] array){ this.array = array; } public void heap (int[] aArray){ int left = 0; int right = aArray.length - 1; int n = aArray.length; int

代码:

结果打印值为:

 import java.util.Arrays;

class Heapify {
  int[] array;

  Heapify (int[] array){
   this.array = array;
  }


  public  void heap (int[] aArray){
    int left = 0;
    int right  = aArray.length - 1;
    int n = aArray.length;
    int numOfSwap  = 0;    
    heapify1(aArray, left, right, numOfSwap );  
  }  


  public void heapify1 (int[] aArray, int left, int right, int numOfSwap) {
    //from last one that have a child
    for (int i = (right - 1)/2; i > left - 1;  --i){  
      System.out.println("in heapify for loop with i =  " + i + "    number of swap: " + numOfSwap);
      if (aArray[2*i + 2] > aArray[i]) {//if right child is bigger than parent
        System.out.println("in heapify for loop and if #1: " + numOfSwap);
        swap(aArray, i, 2*i + 2, right, numOfSwap);
      }
      else if (aArray[2*i + 1] > aArray[i]){
        System.out.println("in heapify for loop and else if #2: " + numOfSwap);
        swap(aArray, i, 2*i + 1, right, numOfSwap);
      }
    }
  }


  public int swap (int[] aArray, int parent, int child, int right, int numOfSwap ){
    System.out.println("in swap before: " + numOfSwap );
    int temp = aArray[parent];
    aArray[parent] = aArray[child];
    aArray[child] = temp;
    numOfSwap  = numOfSwap  + 1;
    System.out.println("inswap after: " + numOfSwap );
    heapify1 (aArray, parent, right, numOfSwap );
    return numOfSwap;
  }


  public static void main(String args[]) {
    int[] array1 = new int[] {21,15,25,3,5,12,7,45,19,2,9};

    Heapify hs = new Heapify(array1);
    hs.heap(array1);
  }
}
我不明白为什么
swap
numoswap=1
传递给
heapify1
,但在for循环中,迭代的第二次,
numoswap
被值0覆盖。还有,为什么在后一种情况下,这样的覆盖行为发生在第三次迭代中


我知道这可能是“按引用传递”或“按值传递”的问题,但真正让我困惑的一件事是numOfSwap在交换中从0更新为1,swap调用heapify1再次成功地将numOfSwap=1传递给heapify1。但是为什么numOfSwap在迭代后会在for循环中初始化?

有两种不同类型的
heapify1
方法上下文

一种是调用heapify1时(aArray、左、右、numoswap)
堆中
方法。在此上下文中,
numOfSwap
为0,并保持为0。在这个上下文中,执行for循环。它可能看起来像“迭代后在for循环中初始化numOfSwap?”,但它不是真的。该值永远不会被修改,并保持为0


另一个上下文是调用heapify1(aArray,parent,right,numoswap)时的上下文swap方法中的code>,也就是说“swap再次调用heapify1,并将numOfSwap=1成功传递给heapify1”。但这些传递的值仅在此上下文中使用,与前面提到的第一个上下文无关,并且不会修改
numOfSwap
的值0。

您的代码无法编译<未定义
heapify1
方法中的code>swoptimes。代码无法生成您的输出。例如,在heapify:“中没有可以打印的位置。@TKJohn对打字错误表示抱歉。更正,现在它编译和runs@Bighuyou重写谢谢你的答案,但我仍然没有找到你的答案解释了以下输出:第5行到第8行的输出。显然,在swap方法中,它调用heapify并传递numoswap=1,结果heapify的numoswap为1。但是后来它只是被覆盖到初始值ohh,你的意思是当NumOfSwap被初始化时,这意味着迭代跳出了上一个称为swap的迭代,并向NumOfSwap添加了1,所以现在它返回到heap调用的heapify?@Bighuyou返回值,但不处理它。
swap
中的
numoswap
swap
的本地值:
heapify1
中的值没有被“覆盖”,它只是没有改变,因为你说的是两个不同的值。@DaveNewton我想确定我的以下理解是否正确:当我用
I=4
heapify
调用
swap
时,
numoswap
swap
中得到+1,然后用
numoswap++
交换调用
heapify
,但是当我们从
i=4
的迭代中退出时,
heapify
返回到
heapify
调用的
heapify
numoswap=0`?谢谢
in heapify: 0
in heapify for loop with i = 4    number of swap: 0
in heapify for loop and if #1: 0
in swap before: 0
inswap after: 1
in heapify: 1
in heapify for loop with i = 4    number of swap: 1
in heapify for loop with i = 3    number of swap: 0
in heapify for loop and if #1: 0
in swap before: 0
inswap after: 1
in heapify: 1
in heapify for loop with i = 4    number of swap: 1
in heapify for loop with i = 3    number of swap: 1
in heapify for loop and else if #2: 1
in swap before: 1
inswap after: 2
in heapify: 2
in heapify for loop with i = 4    number of swap: 2
in heapify for loop with i = 3    number of swap: 2
in heapify for loop with i = 2    number of swap: 0
in heapify for loop with i = 1    number of swap: 0
in heapify for loop and else if #2: 0