Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-参数和增强的For循环复制问题_Java_Foreach_Parameter Passing_Arrays - Fatal编程技术网

Java-参数和增强的For循环复制问题

Java-参数和增强的For循环复制问题,java,foreach,parameter-passing,arrays,Java,Foreach,Parameter Passing,Arrays,假设我有这样的代码 public void insert(Student[] stus) { int count = 0; for(Student s: stus) { s.setId( bla bla); stus[count].setId(bla bla) // is this line needed? count++; } } 所以,如果我从增强for循环中更改了s上的任何内容,我也可以看到stus数组中的更改吗?增强型for循环副

假设我有这样的代码

public void insert(Student[] stus)
{
    int count = 0;
    for(Student s: stus)
    {
    s.setId( bla bla);
    stus[count].setId(bla bla) // is this line needed?
    count++;
    }
}

所以,如果我从增强for循环中更改了s上的任何内容,我也可以看到stus数组中的更改吗?增强型for循环副本如何在参数或其他事物中工作?

增强型for循环不会创建您正在迭代的集合或数组元素的副本,因此
s.setId()
stus[count].setId()
将更新相同的
Student
实例


stus[count].setId(bla-bla)
是不需要的,因为
s.setId(bla-bla)
也是这样做的。

Yes-
s
只是一个包含从
stus
复制的值的变量。该值是对对象的引用-通过
s
所做的更改仍将在
stus
中可见。复制的只是参考资料。因此,您的循环可以是:

for (Student s : stus) {
    s.setId(...);
}
根本不需要
计数
,除非它是ID计算的一部分。如果它是该计算的一部分,我将使用常规for循环:

for (int i = 0; i < stus.length; i++) {
    s.setId(/* some expression involving i */);
}
for(int i=0;i
stus
是对数组对象的引用,这意味着在
insert
中对其执行的任何更改都会影响实际参数(用于调用
insert
的变量)及其元素的更改

另一方面,您不需要
count
,因为
s
已经是对迭代元素的引用:

public void insert(Student[] stus)
{
    for(Student s: stus)
    {
        s.setId( bla bla);
    }
}

增强的for循环不对数组使用迭代器。谢谢你的时间和回答。那么它是否使用迭代器呢?@JonSkeet我是不精确的。迭代器在迭代Iterable时使用。在这个问题中,OP是在数组上迭代的,因此没有迭代器。@MertSerimer如果
stus
是一个Iterable(例如列表或集合),它将使用迭代器,但由于它是一个数组,所以不使用迭代器。谢谢您的时间和回答。好吧,如果需要那条线,那么我需要一个柜台。你会问为什么不使用普通的“for”?这是因为与增强语法相比,我懒得编写这么长的语法for@MertSerimer:但当您单独需要声明
count
并将其递增时,它不会变长。基本上,如果您需要知道您正在进行哪个迭代(并且您正在迭代一个数组),我建议使用普通的
for
循环。如果您不需要迭代次数,那么增强的for循环更简单,是的。谢谢您的时间和回答。好吧,如果需要那条线,那么我需要一个柜台。你会问为什么不使用普通的“for”?这是因为我太懒了,无法编写这么长的语法,因为与增强版forJava相比,它从来没有使用过按引用传递。引用是按值传递的。这与通过引用传递不同。特别是,如果您编写
stus=newstudent[0]insert
方法中,调用方将看不到该方法,如果使用true pass by reference,则调用方将看不到该方法。@JonSkeet我假设在所有情况下,如果按值传递对象的引用,效果就像按引用传递该对象。@PabloFranciscoPérezHidalgo:这是一个错误的假设-以及您的描述(当然,正如其他人所说)在过去,很多习惯于通过引用进行实传递的人对此感到困惑。重要的是要理解Java中变量的值从来不是对象,而是原语或引用。接下来,所有参数都是通过值传递的-参数的初始值是参数值的副本。在这一点上,每个hing很简单。@JonSkeet我知道Java中变量的值不是值本身,除非它是基元类型。您只能通过对象的引用来访问对象,当然,当您将对象作为参数传递时,它的引用是按值传递的。但是,其效果是,如果您在方法中更改对象,则会更改ame对象,因为您复制的是引用而不是对象。其效果类似于按引用传递对象,尽管它是按引用传递的值。