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

Bighuyou

代码:

 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);
  }
}

结果打印值为:

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

我不明白为什么swap传递numOfSwap = 1heapify1,但是在 for 循环中,第二次迭代numOfSwap被值 0 覆盖。另外,为什么在后一种情况下,这种被覆盖的行为发生在第三次迭代?

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

约翰

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

一个是打电话时heapify1(aArray, left, right, numOfSwap );heap方法。在这个上下文中,numOfSwap是 0,并保持 0。并且正是在这个上下文中,for执行循环。它可能看起来像“numOfSwap 在迭代后在 for 循环中被初始化?”,但事实并非如此。该值永远不会被修改并保持为 0。

另一个方面是打电话时heapify1 (aArray, parent, right, numOfSwap );swap方法,所以说“交换电话heapify1再次通过numOfSwap = 1〜heapify1成功”。但是这些传递的值只在这个上下文中使用,与前面提到的第一个上下文无关,也不会修改值为numOfSwap0的值

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么一定变量在for循环初始化声明?

来自分类Java

为什么Final变量不需要在Java的main方法中初始化?

来自分类Python

在TensorFlow中,有什么方法可以初始化未初始化的变量?

来自分类Java

Java:为什么需要初始化原始的本地变量?

来自分类Java

Java-最终变量可以在静态初始化块中初始化吗?

来自分类Java

Java中未初始化的类成员不会发出任何编译器错误。但是局部变量可以。为什么?

来自分类Java

有什么办法在初始化枚举时传递变量,而不是在Java中传递实际值?

来自分类Dev

为什么在直接初始化和分配中传递lambda而不在复制初始化中传递lambda时,为什么会编译呢?

来自分类Java

为什么Java默认只初始化类变量而不初始化局部变量?

来自分类Dev

为什么在Swift中初始化变量的行上出现“初始化前使用变量”错误?

来自分类Dev

为什么我不能按顺序在一个文件中初始化两个静态类变量,而不能初始化三个?

来自分类Dev

为什么不能在Java中的开关内初始化变量?

来自分类Dev

JAVA:是否可以在循环内使用已在循环内初始化的变量?

来自分类Java

为什么这段代码说明变量j可能尚未初始化?它正在循环内初始化

来自分类Dev

为什么变量j初始化不能出现在for循环的终止表达式中?

来自分类Dev

为什么我的变量没有初始化值?

来自分类Dev

为什么final可以在构造函数中初始化?

来自分类Dev

为什么Dart只允许在初始化列表中初始化Final变量?

来自分类Dev

为什么可以将未初始化的变量地址传递给函数的指针参数

来自分类Dev

为什么我的未初始化变量在TryParse中设置了值后又会再次取消赋值?

来自分类Dev

为什么零初始化不是c ++中未初始化变量的默认值?有编译器选项可以强制执行吗?

来自分类Dev

在for循环初始化中使用let时,为什么封闭范围中没有let变量?

来自分类Dev

为什么Java需要初始化变量?

来自分类Dev

为什么我们不能在构造函数初始化列表中初始化静态变量,但可以在构造函数主体中初始化

来自分类Dev

为什么我无法在jQuery中初始化变量?

来自分类Dev

为什么不能用其他变量的值初始化静态变量?

来自分类Dev

忽略变量中的初始化值

来自分类Dev

为什么不在 Java 中的未初始化数组上“为每个”循环

来自分类Dev

为什么这种类型的最终变量初始化不能在 Java 中编译?

Related 相关文章

  1. 1

    为什么一定变量在for循环初始化声明?

  2. 2

    为什么Final变量不需要在Java的main方法中初始化?

  3. 3

    在TensorFlow中,有什么方法可以初始化未初始化的变量?

  4. 4

    Java:为什么需要初始化原始的本地变量?

  5. 5

    Java-最终变量可以在静态初始化块中初始化吗?

  6. 6

    Java中未初始化的类成员不会发出任何编译器错误。但是局部变量可以。为什么?

  7. 7

    有什么办法在初始化枚举时传递变量,而不是在Java中传递实际值?

  8. 8

    为什么在直接初始化和分配中传递lambda而不在复制初始化中传递lambda时,为什么会编译呢?

  9. 9

    为什么Java默认只初始化类变量而不初始化局部变量?

  10. 10

    为什么在Swift中初始化变量的行上出现“初始化前使用变量”错误?

  11. 11

    为什么我不能按顺序在一个文件中初始化两个静态类变量,而不能初始化三个?

  12. 12

    为什么不能在Java中的开关内初始化变量?

  13. 13

    JAVA:是否可以在循环内使用已在循环内初始化的变量?

  14. 14

    为什么这段代码说明变量j可能尚未初始化?它正在循环内初始化

  15. 15

    为什么变量j初始化不能出现在for循环的终止表达式中?

  16. 16

    为什么我的变量没有初始化值?

  17. 17

    为什么final可以在构造函数中初始化?

  18. 18

    为什么Dart只允许在初始化列表中初始化Final变量?

  19. 19

    为什么可以将未初始化的变量地址传递给函数的指针参数

  20. 20

    为什么我的未初始化变量在TryParse中设置了值后又会再次取消赋值?

  21. 21

    为什么零初始化不是c ++中未初始化变量的默认值?有编译器选项可以强制执行吗?

  22. 22

    在for循环初始化中使用let时,为什么封闭范围中没有let变量?

  23. 23

    为什么Java需要初始化变量?

  24. 24

    为什么我们不能在构造函数初始化列表中初始化静态变量,但可以在构造函数主体中初始化

  25. 25

    为什么我无法在jQuery中初始化变量?

  26. 26

    为什么不能用其他变量的值初始化静态变量?

  27. 27

    忽略变量中的初始化值

  28. 28

    为什么不在 Java 中的未初始化数组上“为每个”循环

  29. 29

    为什么这种类型的最终变量初始化不能在 Java 中编译?

热门标签

归档