我有一个包含四个堆栈的数组。我正在使用foreach循环初始化它。
Stack s[]=new Stack[4];
for(Stack n:s)
{
n=new Stack();
}
System.out.println(s[0]);
但问题是它打印为null。但是当我用正常的循环替换它时
Stack s[]=new Stack[4];
for(int i=0;i<4;i++)
{
s[i]=new Stack();
}
System.out.println(s[0]);
打印[]。我尝试使用其他Java集合LinkedList,ArrayList等,但都具有相同的行为。我的问题是为什么第一种方法不起作用,它曾经在任何地方工作?
答案 0 :(得分:1)
这里:
for(Stack n:s)
{
n = new Stack();
}
n
是一个局部变量,它引用当前数组元素,而当前值为null
。
但是当您将新对象分配给n
(new Stack()
)时,n
不再引用数组元素,而是引用新创建的对象。
新创建的对象最终在每次迭代时被丢弃,当前数组元素保持null
。
阵列上的这个foreach代码:
for(Stack n : s){
n = new Stack();
}
可以由编译器翻译成这段代码:
for (int i = 0; i < s.length; i++) {
Stack n = s[i]; // the array element is stored in a local variable
n = new Stack(); // the n local variable refers to a new Stack object
// but is not assigned to s[i]
}
当您使用此语法时:
s[i]=new Stack();
您明确地将新创建的对象分配给数组的i
元素。
答案 1 :(得分:0)
您可以执行以下操作来填充数组。
Stack s[]=new Stack[4];
Arrays.setAll(s, i -> new Stack());
System.out.println(s[0]);