当我写这样的时候:
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。
为什么在第二个版本函数中,值没有变化?它是否仅为数组元素更改值?
答案 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
数组类型)。此fyeah
与fyeah
方法中的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是按值传递,因此调用代码中的变量不会被此方法更改)