foreach中的 i 为什么不自增?

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] a = new int[5];
        for(int i:a) {
            a[i] = 7;
        }
        System.out.println(Arrays.toString(a));
        //输出结果是[7, 0, 0, 0, 0]

        int[] b = new int[5];
        for(int j = 0; j < b.length; j++) {
            b[j] = 7;
        }
        System.out.println(Arrays.toString(b));
        //输出结果是[7, 7, 7, 7, 7]

    }
}

为什么增强for循环中的 i 不会像普通for循环中的 j 一样自增呢 

for(int i:a) {
  a[i] = 7;
}

这段代码和下面的是一样的

for(int j = 0; j <= a.length; j++) {
  int i = a[j];
  a[i] = 7;
}

因为a数组是[0,0,0,0,0];

所以,每次的i都是0;

也就是说,每次修改的都是a[0];

所以只有第一个会改

增强for循环中的 i  指向a数组的每一个元素,并不是for循环的下标
简单说不是一个东西

int等基本数据类型,都有个默认值,除了char是个空字符,int的默认值是0;所以int[] a = new int[5];等价于int[] a = new int {0,0,0,0,0};

增强for循环打印的不是下标,而是值。

foreach仅可用于遍历输出数组,但不能用于修改数组。