Java中:在构造函数中使用foreach循环初始化多维数组数据字段

Java中:在构造函数中使用foreach循环初始化多维数组数据字段,java,multidimensional-array,datafield,Java,Multidimensional Array,Datafield,所以我尝试创建一个类,它封装了一个2D字符数组。特别是,我要做的是定义默认构造函数,以便封装的2D数组包含默认字符(本例中为“#”)。我的问题是:当我试图通过嵌套的foreach循环系统地用默认字符填充数组时,编译器没有确认我正在使用第二个嵌套循环的初始化字符参数c,尽管我显然使用了赋值c='#'。引用Eclipse的话,“不使用局部变量c的值。” 以下是相关代码: public class 2DCharArr { private char[][] chars; private byte l

所以我尝试创建一个类,它封装了一个2D字符数组。特别是,我要做的是定义默认构造函数,以便封装的2D数组包含默认字符(本例中为“#”)。我的问题是:当我试图通过嵌套的foreach循环系统地用默认字符填充数组时,编译器没有确认我正在使用第二个嵌套循环的初始化字符参数c,尽管我显然使用了赋值c='#'。引用Eclipse的话,“不使用局部变量c的值。”

以下是相关代码:

public class 2DCharArr
{
 private char[][] chars;
 private byte length_x, length_y;

 public 2DCharArr()
 {
  length_x = 10; length_y = 10;
  chars = new char[length_x][length_y];
  for (char[] arr : chars)
   for (char c : arr)
    c = '#'; // Does not signal to Eclipse that c was used.
 }
}

我在foreach循环中的语法是否有问题,以致编译器无法确认我使用了c?如果有人能帮我澄清这一点,那就太好了,因为这会阻止我使用foreach循环来创建包含多维数组的对象,尽管我觉得如果我能够非常熟练地使用这种语言,我应该能够做到。提前感谢您的洞察力

使用增强型for语句时,不能赋值。您必须以传统的方式对它们进行迭代,并将值分配到特定的索引中

for(int i= 0; i < chars.length; i++) {
    for(int j = 0; j < chars[i].length; j++) {
        chars[i][j] = '#';
    }
}
for(int i=0;i
其原因在以下方面存在细微差别:

  • 如果它是一个
    Iterable
    ,它将使用迭代器,迭代器的结果是绑定到变量的
    next()
  • 如果它是数组类型,它将创建一个索引值绑定到变量的for循环

在这两种情况下,您都无法修改传入的变量以产生任何有意义的效果,例如赋值。

您混淆了赋值的用法:

int x = 5;
int y = x;
y = 6;
不会更改x的值。您的内部循环本质上是“说”:

这不会更改
arr[当前索引]
的值,只会将
c
的值更改为“#”,但保留原始
arr
数组不变。编译器警告您,您正在创建的
c
变量从未使用过(表示从未读取)

请注意,此循环可以正常工作:

for (char[] arr : chars)
    for (int x = 0; x < arr.length; x++)
        arr[x] = '#';
for(char[]arr:chars)
对于(int x=0;x

外部foreach循环将
arr
变量指定给
chars
中的当前
char[]
对象。然后
arr[x]
将第x个元素h赋值为“#”。

啊,我明白了。。。这很有启发性,但也有点令人困惑,因为它显然违背了几乎所有Java教程都声称的“它只是数组的for循环”思想。现在作为一个业余爱好者,我可能不应该评判发明Java的伟人,但我认为如果你要制作一个像foreach循环这样的直观符号,那么你应该按照预期的直觉来设计它。当然,直觉“我可以在for循环中这样做(例如赋值),所以我应该也可以在foreach循环中这样做”是一种常见的直觉,对吗?这是一个相当糟糕的问题……好吧,对于初学者来说,它不仅仅是数组的for循环;除了数组之外,您还可以将其用于任何
Iterable
。其思想还在于读取与数组中的每个元素相关的增强for as,而不是数组中的每个位置。这可能是教程所犯的错误。很明显,所使用的变量在数组中只包含一个值。语言中的符号如何携带如此不明显的规范,这既让我感到有趣,也让我感到恼火。但我想知道这些含义是这个领域男人和男孩的区别,所以我不应该抱怨太多。谢谢你的提示!
for (char[] arr : chars)
    for (int x = 0; x < arr.length; x++)
        arr[x] = '#';