为什么Java方法不起作用,?

为什么Java方法不起作用,?,java,Java,在Java中为什么要传入一个参数,该参数在一个方法中得到正确的更改,但调用此方法后在主方法中的参数没有更改 我的代码: public void RSort123(Student[] stu) { int k = 0; Student[] stu1 = new Student[this.len]; for (int i = 0; i < this.len; i++) stu1[i] = new Student(); Clear(array);

在Java中为什么要传入一个参数,该参数在一个方法中得到正确的更改,但调用此方法后在主方法中的参数没有更改

我的代码:

public void RSort123(Student[] stu) {
    int k = 0;
    Student[] stu1 = new Student[this.len];
    for (int i = 0; i < this.len; i++)
        stu1[i] = new Student();
    Clear(array);
    for (int i = 0; i <= 100; i++) {
        for (int j = 0; j < this.len; j++) {
            if (stu[j].english == i) {
                array[i][k++] = j;

            }
        }
        k = 0;
    }// 分配

    for (int i = 100, j = 0; i >= 0; i--) {
        for (int l = 0; array[i][l] != -1; l++) {
            stu1[j] = stu[array[i][l]];
            j++;
        }
    }// 收集

    stu = stu1;
    System.out.println("---------------stu----------------");
    for (int p = 0; p < len; p++)
        stu[p].display();
    System.out.println("---------------stu1---------------");
    for (int p = 0; p < len; p++)
        stu1[p].display();
    System.out.println("---------------end----------------");
}
代码是主代码的一部分


Java按值传递参数,所以虽然可以更改stu中的内容,但不能替换stu本身


将stu视为一个局部变量,它引用与本例相同的jn,数组作为主站中的stu,因此在方法中更改stu不会影响主站中的stu,但更改它们共享的数组中的内容将显示在两者中。

错误在于您修改了另一个对象stu1,然后将stu的引用更改为stu1。这将在你的方法中起作用,但不会影响stu在你的主要方法中的引用。它仍将引用您的旧stu对象。所以你必须这样做:

public Student[] RSort123(Student[] stu){

        int k = 0;
        Student[] stu1 = new Student[this.len];
        for(int i=0; i<this.len; i++)
            stu1[i] = new Student();
        Clear(array);
        for(int i=0; i<=100; i++){
            for(int j=0; j<this.len; j++){
                if(stu[j].english == i){
                    array[i][k++] = j;

                }
            }
            k = 0;
        }//分配


        for(int i=100,j=0; i>=0; i--){
            for(int l=0; array[i][l]!=-1; l++){
                stu1[j] = stu[array[i][l]];
                j++;
            }
        }//收集

        stu = stu1;
        System.out.println("---------------stu----------------");
        for(int p=0; p<len; p++)
            stu[p].display();
        System.out.println("---------------stu1---------------");
        for(int p=0; p<len; p++)
            stu1[p].display();
        System.out.println("---------------end----------------");
        return stu;
    }
主要是:

stu=rs.RSort123(stu);            **//Call the method.  But not work, But in RSort123()method stu changed.  Why?**
System.out.println("姓名\t语文\t数学\t英语\t总分");
for(int i=0; i<length; i++){
    stu[i].display();
}

您必须让您的方法返回修改过的对象stu,然后在main方法中将stu对象设置为您的方法返回的新对象。

哪里定义了长度?函数是否进入了循环?对不起,体育,我有一个相当全面的答案给你,但正如我想添加它,这个问题被标记为重复。你的问题在于语句stu=stu1。这根本不起作用,因为它不会更改被引用的对象。尝试将stu1作为参数传递到方法中,而不是在方法内部创建它。您的代码肯定会以这种方式更改stu中的值。。。也许它甚至会像预期的那样工作-所以,如果代码直接修改了stu的内容,那就行不通了?不,你的回答当然是对的。我的2美分代码可以工作,但解释不正确。请看这里:对不起,这不完全是真的。Java中的参数是通过引用传递的,而不是通过值传递的。如果情况并非如此,则根本无法通过将数组传递给方法来更改数组中的值。我认为您的意思是,您不能更改方法中的引用,将参数ref分配给方法中的另一个对象不会改变作为参数给定的对象。@AchimSchmitz:在大多数语言中,通过引用传递意味着在原始代码stu=stu中进行的分配是有效的。也许Java使用这个术语的方式不同,但要点是相同的。为什么人们对这个问题投反对票。我认为这不是一个愚蠢的问题,很多初学者都会犯这个错误,即使你告诉他们不要这样做。@momosxp:那也是吗?仁慈的回答是,这是一个复制品。我已经考虑过复制品的问题,它对我来说没有什么意义。问这个问题的那个可怜的家伙事先并不知道他在错误地处理参数引用。指出错误的代码行,并向他指出另一个答案就足够了。。。如果你知道的话。只是投票否决这个问题,委婉地说,是傲慢的。
stu=rs.RSort123(stu);            **//Call the method.  But not work, But in RSort123()method stu changed.  Why?**
System.out.println("姓名\t语文\t数学\t英语\t总分");
for(int i=0; i<length; i++){
    stu[i].display();
}