为什么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