所以我正在尝试创建一个封装2D数组字符的类。特别是,我想要做的是定义默认构造函数,以便封装的2D数组包含默认的char(在这种情况下为'#')。我的问题:当我尝试通过嵌套的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循环来创建包含多维数组的对象,尽管我觉得我应该能够如果我能够非常称职用语言。提前感谢您的见解!
答案 0 :(得分:4)
使用enhanced-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()
绑定到您的变量。在任何一种情况下,您都无法将传入的变量修改为任何有意义的效果,例如赋值。
答案 1 :(得分:1)
您对分配的使用感到困惑:
int x = 5;
int y = x;
y = 6;
不会改变x的值。你的内循环基本上是&#34;说&#34;:
char c = arr[current index];
c = '#';
这不会更改arr[current index]
的值,只会将c
的值更改为&#39;#&#39;,但保留原始arr
数组不变。编译器警告您,您正在创建的变量c
永远不会被使用(意味着永远不会读取)。
请注意,此循环可以正常工作:
for (char[] arr : chars)
for (int x = 0; x < arr.length; x++)
arr[x] = '#';
外部foreach循环指定arr
变量指向char[]
内的当前chars
对象。然后arr[x]
使用值&#39;#&#39;指定第x个元素。