Java什么情况下方法会改变传递给它的参数变量的内容?

书上说Java程序总是采用按值调用的,方法不能修改传递给它的任何参数变量的内容。下面的代码数组scores传入方法perfect后值却跟数组x一样改变了,这是为什么?

import java.util.*;
public class HelloWorld {

public static void main(String[] args) {
    int[] scores=new int[]{89,-23,64,91,119,52,73};
    HelloWorld a=new HelloWorld();
    a.perfect(scores);
    for(int t:scores)
    System.out.print(t+" ");     

}   
//定义方法完成成绩排序并输出前三名的功能
public void perfect(int[] x)
{
    for(int i=0;i<x.length;i++)
    {
        if(x[i]<0||x[i]>100)
        x[i]=0;
    }
    Arrays.sort(x);
    System.out.println("考试成绩前三名为:");
    System.out.println(x[6]);
    System.out.println(x[5]);
    System.out.println(x[4]);
    for(int r:x)
    System.out.print(r+" ");
    System.out.println();

}


输出为:
    考试成绩前三名为:

91

89

73

0 0 52 64 73 89 91

0 0 52 64 73 89 91

}

3个回答

任何情况下都不会改变变量。

你这个不是改变变量,而是改变了变量(引用)对象本身。

看下面两个的不同:
(1)修改变量
void foo(int i)
{
i = 3; //改变i
}
void bar(Person p)
{
p = new Person(); //对于引用变量,改变了它指向的对象。
}
以上,都不会反应到实参。
(2)修改对象的状态:
void foo(ArrayList l)
{
l.add(123); //还是那个l变量,没有指向新的变量,而是改变它的状态
}
void bar(Person p)
{
p.Name = "xxx"; //还是那个p,注意和Person p = new Person(); p.Name = xxx; 的区别
}
NoobyGoo
NoobyGoo 多谢回答,大概理解了。
大约一年之前 回复

同是初学者,互相探讨一下吧
估计应该是和Java的数据类型有关,数组在Java中是引用数据类型,你说的参数不改变指的应该是非引用数据类型的
做个示例:

public class Demo {
    public static void main(String args[]) {
        int a = 10;
        Demo d = new Demo();
        System.out.println(a);
        d.test(a);
        System.out.println(a);
        }

    public void test(int x) {
        x *= x;
    }

这是将一个int型变量作为参数,运行后发现a并没有改变。
再来一个示例

public class Demo {
    public static void main(String args[]) {
        int a = 10;
        Demo d = new Demo();
        System.out.println(a);
        d.test(a);
        System.out.println(a);
        System.out.println("---------------------------------");
        int b[] = new int[] { 1, 20, 3, 4, 5 };
        d.test2(b);
        for (int x : b)
            System.out.println(x);
    }
    public void test(int x) {
        x *= x;
    }

    public void test2(int x[]) {
        for (int i = 0; i < x.length; i++) {
            x[i] = x[i] + 1;
            System.out.println(x[i]);
        }

    }   

结果是数组b的所有值都变了。

NoobyGoo
NoobyGoo 可以参考:https://blog.csdn.net/gennis2008/article/details/51822975
大约一年之前 回复
NoobyGoo
NoobyGoo 看到别的介绍,大意是:数组b存放在栈中,其中的元素存放在堆中,参数传递的是栈指向堆的地址给数组x, 所以x和b同时指向堆中的同一元素,同时改变。
大约一年之前 回复

因为传递数组变量时传递的是这个数组变量的引用,也就是这个数组在内存中的地址。

简单来说你在perfect方法中操作的是内存中这个数组的值,而不单单是数组的值。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问