数组中的数组是否有变化?

时间:2011-08-19 21:18:06

标签: java arrays evaluation-strategy

当我写这样的时候:

public class test {

    void mainx()
    {
        int fyeah[] = {2, 3, 4};
        smth(fyeah);
        System.out.println("x"+fyeah[0]);
    }

    void smth(int[] fyeah)
    {
        fyeah[0] = 22;
    }
}

打印x22;

当我写这样的时候:

public class test {

    void mainx()
    {
        int fyeah = 5;
        smth(fyeah);
        System.out.println("x"+fyeah);
    }

    void smth(int fyeah)
    {
        fyeah = 22;
    }
}

它不打印x22,但打印x5。

为什么在第二个版本函数中,值没有变化?它是否仅为数组元素更改值?

6 个答案:

答案 0 :(得分:22)

第一个示例中的fyeah变量包含对数组的引用(不是数组),而第二个示例中的fyeah整数包含 an整数

由于Java通过值传递所有,因此会发生以下情况:

在数组中:将发送数组引用的副本,并且将更改原始数组。

在int情况下: 整数的副本将被更改,原始整数将不会更改。

答案 1 :(得分:2)

这是因为你的int是一个原语,方法smth创建了一个本地副本,这就是为什么它不按你想要的方式打印的原因。对象也按值传递,但是内存中指针的值。因此,当它被更改时,指针将保留在两个方法中并且您会看到更改。 Read More Here

答案 2 :(得分:2)

确定。 java中的int(实际上所有具有严格数据类型的语言)都是原始数据类型。它只是该数据类型的单个变量。在java中,这意味着它通过值传递给方法。因此,当您传入参数时,将创建传递的变量的副本。方法中发生的任何操作都对该副本起作用,而不是传递的变量。

实际上在java中,EVERYTHING是通过值传递的,但是接下来我接下来要说的实际上是真实的细节似乎是不可取的。

使用数组...它是原始数据类型int的变量集合。因此,数组的整个副本实际上并不仅仅是对存储数组的内存的引用的副本。所以是的,数组中int的值是从方法中的操作改变的。

简而言之,方法不会使用方法中的操作更改基元的外部值(int,float,double,long,char),如果您希望将这些操作的结果值返回给调用者获得它。操作确实会更改大多数对象以及基元数组的值。希望有所帮助。真的不确定得到的水平有多低。也许其他人可以清楚地解释为什么它的价值。我“得到”但很难帮助其他人理解。

答案 3 :(得分:1)

根据记忆来考虑:让我们分析你的第一个程序 -

mainx中,fyeah是一个int的数组,所以它是一个引用(如果可能的话,还是指针)。此引用指向堆内存中存储int的实际数组的位置。让我们在地址100说。从这里连续是三个整数(让我们说从地址100开始,104和108分别是2,3和4)。

现在,您调用方法smth并传递参考。在该方法中,还有另一个名为int的引用(fyeah数组类型)。此fyeahfyeah方法中的mainx引用完全不同。现在,当您致电smth并从fyeah传递mainx时,fyeah方法中的smth被初始化为指向同一位置(即内存)地址100) 当您访问fyeah的0元素并为其赋值22时,它会到达内存位置100并在此处写入该值22。当您使用mainx方法返回时,fyeah引用仍指向内存地址100.但该位置的值现在为22.因此,当您访问第一个元素时,您将获得该值来自fyeah中的mainx

现在,你的第二个节目。您的mainx方法声明int(不是数组,而是简单的int)并将其设置为5.此fyeah变量是在不在堆上的堆栈上创建的。值5存储在堆栈中。现在你调用smth并传递这个变量。在方法smth中,您再次按名称声明int变量fyeah(作为正式方法参数)。同样,这与fyeah方法的mainx不同,此fyeah也在堆栈上创建。此变量将初始化为值5,从{{1复制你传递给fyeah作为参数。现在请注意,smth变量上有两个不同的副本,两者都在堆栈上,值都为5.现在,您在fyeah中为fyeah分配值为22.这不会会影响smth方法的fyeah,因此当您返回mainx并访问mainx时,您会看到5。

答案 4 :(得分:0)

int是一个值类型,因此5直接传递到smth,只能修改本地副本。另一方面,数组是引用类型,因此可以修改该数组的元素。

答案 5 :(得分:0)

从技术角度来看,我会说

    fyeah[0] = 22;

正在改变(fyeah指向的对象)的内容,而

    fyeah = 22;

正在改变(变量)fyeah本身 另一个例子:

void smth(Person person) {
    person.setAge(22);
}

正在改变(人的内容)

void smth(Person person) {
    person = otherPerson;
}

正在更改变量person - Person的原始实例仍未更改(并且,由于Java是按值传递,因此调用代码中的变量不会被此方法更改)