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

我正在制作一个数组工具类,用于将Python功能添加到Java数组中,我遇到了这个问题。这显然是一个简化的、更通用的版本

问题: 在本例中:

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]−+