在Java中为什么传入一个参数,一个方法中的参数得到了正确的改变,但是在参数的main方法中调用这个方法之后却没有改变?
我的代码:
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----------------");
}
代码部分主要代码
//Call the method. But not work, But in RSort123() method stu changed. Why?
rs.RSort123(stu);
System.out.println("姓名\t语文\t数学\t英语\t总分");
for(int i=0; i<length; i++){
stu[i].display();
}
答案 0 :(得分:1)
Java按值传递参数,因此虽然您可以对 stu
中的进行更改,但您无法替换stu
本身。
将stu
视为一个局部变量,它引用与main中stu
相同的(本例中为jn),因此更改方法中的stu
不会影响main中的stu
(但更改 它们共享的数组中的内容将显示在两者中)。
答案 1 :(得分:1)
故障是您修改了另一个对象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对象设置为你的方法返回的新对象。