Java 如何使用for each循环将对象指定给点阵列
编辑:是的,我知道如何使用for循环 我这样做Java 如何使用for each循环将对象指定给点阵列,java,arrays,object,Java,Arrays,Object,编辑:是的,我知道如何使用for循环 我这样做 Point [] pointArray = new Point [10]; for(Point p : pointArray) p = new Point(1,2); 但这行打印的是null System.out.println(pointArray[0]); //Prints null 尽管这样做是可以的 pointArray[0] = new Point(1,2); System.o
Point [] pointArray = new Point [10];
for(Point p : pointArray)
p = new Point(1,2);
但这行打印的是null
System.out.println(pointArray[0]); //Prints null
尽管这样做是可以的
pointArray[0] = new Point(1,2);
System.out.println(pointArray[0]); //Prints java.awt.Point[x=1,y=2]
为什么会这样?在增强for循环中,p不是数组元素的别名。它只包含元素的值,而不引用数组中的对象您正在对空值进行迭代,并将新的点对象指定给引用,但实际上并没有将其存储到数组中,因此,您无法查看记录。您不能使用增强的for循环通过迭代器修改或写入数组中的数据,只能读取它 但是,常规for循环可以修改数据
for(int i =0; i < array.length; i++){
array[i] = point(1,2)
}
for(int i=0;i
@蛛形纲蜂巢
正如蜘蛛纲蜂心在他的回答中所说
“在增强的for循环中,p不是数组元素的别名。它只有元素的值,而不引用数组中的对象”首先,您需要了解它们之间的区别 foreach与for:基本区别
for
和foreach
之间唯一的实际区别是,对于可索引对象,您无权访问索引。需要基本for循环时的示例:
for(int i = 0; i < array.length; i++) {
if(i < 10) {
//Do some work
} else {
//Do other stuff
}
}
不建议这样做,因为变量范围并不理想,而for循环的基本格式只是此用例的标准和预期格式
如果
需要访问迭代器以删除当前元素。for each循环的隐藏迭代器,因此不能调用remove/add。因此,for-each循环不可用于过滤。同样,它也不适用于需要在遍历列表或数组时替换其中元素的循环。如其他答案中所述,如果希望为数组中的元素赋值,请使用数组索引
但是,您可能想考虑使用java 8流来创建和初始化数组,而不是将其拆分为两个操作。我发现这是一种相当方便的方法来设置这种类型的数组
例如:Point[] points = IntStream.range(0, 10).map(n -> new Point(n, 2)).toArray();
这避免了必须使用索引遍历数组的问题
for (Point p : pointArray)
// rest of the code goes here
上述声明与
for (int i = 0; i < pointArray.length; i++)
Point p = pointArray[i];
// rest of the code goes here
for(int i=0;i
使用forearch循环填充数组没有任何意义,因为它不是数组的用途。以下是一种方法:
for (int i = 0; i < pointArray.length; i++)
pointArray[i] = new Point(0,0);
for(int i=0;i
现在数组“pointArray”已初始化,您可以使用foreach循环访问其元素。因此
p
中的for(Pointer p:pointArray)
是对数组中引用的对象的引用。数组中引用的对象为空。当我给它分配一个新对象时,我只是引用了p
。啊,没什么。我不知道。知道为什么吗?蛛形纲动物havemind解释得很好。。。
for (int i = 0; i < pointArray.length; i++)
pointArray[i] = new Point(0,0);