Java 为什么要从方法修改变量? 背景
我正在制作一个数组工具类,用于将Python功能添加到Java数组中,我遇到了这个问题。这显然是一个简化的、更通用的版本 问题: 在本例中:Java 为什么要从方法修改变量? 背景,java,arrays,methods,scope,Java,Arrays,Methods,Scope,我正在制作一个数组工具类,用于将Python功能添加到Java数组中,我遇到了这个问题。这显然是一个简化的、更通用的版本 问题: 在本例中: public class ArrayTest { public static void main(String[] args) { // initial setup int[] given = {1, 2, 3, 4, 5}; // change array int[] c
public class ArrayTest
{
public static void main(String[] args)
{
// initial setup
int[] given = {1, 2, 3, 4, 5};
// change array
int[] changed = adjust(given);
// these end up being the same...
System.out.println(Arrays.toString(changed));
System.out.println(Arrays.toString(given));
}
private static int[] adjust(int[] a)
{
for (int i = 0; i < a.length; i++)
{
a[i]++;
}
return a;
}
}
公共类数组测试
{
公共静态void main(字符串[]args)
{
//初始设置
int[]给定={1,2,3,4,5};
//更改数组
int[]已更改=调整(给定);
//这些最终都是一样的。。。
System.out.println(Arrays.toString(已更改));
System.out.println(Arrays.toString(给定));
}
私有静态int[]调整(int[]a)
{
for(int i=0;i
…为什么改变了
和给定了
相同的东西
免责声明
我猜以前有人问过这个问题,但我找不到答案,所以我对此表示歉意。如果你这样做了
int[] given = {1, 2, 3, 4, 5};
给定的
值称为对象引用。它是一个值,告诉JVM数组在内存中的其他位置给定的
不包含数组(类似于int
),它包含对数组的引用(例如,类似于地址)。例如:
当您更改数组的内容时,您正在修改数组的状态。当adjust
返回并将结果分配给changed
时,您有:
+−−−−−−−−−+
[given:Ref88465]−−−−−>| (array) |
/ +−−−−−−−−−+
| | 0: 2 |
| | 1: 3 |
| | 2: 4 |
| | 3: 5 |
| | 4: 6 |
| +−−−−−−−−−+
[changed:Ref88465]−+
+−−−−−−−−−+
[参考文献88465]−−−−−>| (数组)|
/ +−−−−−−−−−+
| | 0: 2 |
| | 1: 3 |
| | 2: 4 |
| | 3: 5 |
| | 4: 6 |
| +−−−−−−−−−+
[更改:参考文献88465]−+
如果您想要一份包含更改的阵列副本,则需要制作一份副本,例如通过
arraycopy
。复制和就地更改在实践中都会使用,具体取决于用例。您所做的是将数组的地址发送到您的方法,因此更改的是原始数组,您只需返回它(数组的地址),因此您对该数组(内存)所做的任何更改将反映在两个变量中,因为两者都指向相同的内存位置您是对的,这一定是重复的。搜索它很棘手,但我们应该能够找到一个。修改传递到方法中的数组将修改该数组:在Java中,我们谈论的不是地址,而是引用。噢。不这是参考!请坚持使用正确的术语。@AmerQarabsa引用变量包含允许JVM将该值映射到正确对象位置的值。JMV可以在内存中移动对象,使其地址可以更改,但这并不意味着引用也会更改。您正在发送引用的副本。指针可以更改它们指向的地址,这在Java中是被禁止的。@AmerQarabsa:它是值的副本,就像int a=42;int b=a
将a
(42)的值复制到b
。这种情况下的值是一个int
;在OP的例子中,它是一个对象引用,但无论如何它都是一个值。所以“参考资料副本”是完全正确的。
+−−−−−−−−−+
[given:Ref88465]−−−−>| (array) |
/ +−−−−−−−−−+
| | 0: 1 |
| | 1: 2 |
| | 2: 3 |
| | 3: 4 |
| | 4: 5 |
| +−−−−−−−−−+
[a:Ref88465]−−−−−−+
+−−−−−−−−−+
[given:Ref88465]−−−−−>| (array) |
/ +−−−−−−−−−+
| | 0: 2 |
| | 1: 3 |
| | 2: 4 |
| | 3: 5 |
| | 4: 6 |
| +−−−−−−−−−+
[changed:Ref88465]−+