所以我试图创建一个封装二维字符数组的类。特别是,我想要做的是定义默认构造函数,以便封装的二维数组包含默认字符(在本例中为“#”)。我的问题:当我尝试通过嵌套 foreach 循环系统地用默认 char 填充数组时,编译器不承认我正在使用第二个嵌套循环的初始化 char 参数 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] = '#';
}
}
其原因是微妙的,因为 is defined in the JLS 的增强方式:
- 如果它是一个
Iterable
,它会使用其迭代器,并将next()
的结果绑定(bind)到您的变量。 - 如果是数组类型,它会创建一个 for 循环,并将索引值绑定(bind)到变量。
无论哪种情况,您都无法修改传入的变量以达到任何有意义的效果,例如赋值。
关于java - 在Java中: using foreach loops in constructors to initialize multidimensional array data fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26132511/