试图找出为什么设置一个对象等于另一个对象会更新两个对象



示例代码

public class test {
    
    public test(){
        runTest();
    }
    
    private void runTest(){
//method 1
        int[] A = {1,2,3,4};
        int[] B = new int[A.length];        
        for (int i = 0; i < A.length; i++){
            B[i] = A[i]+1;
        }
        for (int i: A){
            System.out.println(" A: " + i);
        }
        System.out.println("----------");
        for (int i: B){
            System.out.println(" B: " + i);
        }
        System.out.println("----------");

//method 2                
        int[] C = {1,2,3,4};
        int[] D = C;
        for (int i = 0; i <D.length; i++){
            D[i]++;
        }
        for (int i: C){
            System.out.println(" C: " + i);
        }
        System.out.println("----------");
        for (int i: D){
            System.out.println(" D: " + i);
        }
        System.out.println("----------");
        
        
    }
    
    public static void main(String[] args){
        new test();
    }
}

问题

我在我的一个methods中遇到了一个问题,发现这个问题是创建临时object改变了原始的,这是我不希望发生的。我只是想知道为什么会发生这种情况,我的印象是设置一个object等于另一个只指向当前位置/状态,而不是任何未来的更新。

换句话说,我想知道为什么我对int Aint B做了我做的,而不是对int Cint D做了我做的。

为了使它更简单,上面两个方法的区别是什么?我要尝试一下,当int Cint D被调用时,JVM调用相同的reference,因为我没有像int A int B那样创建一个新对象。

不同之处在于,对于A和B, B是数组的副本,并且是与A完全独立的对象。对于C和D, D是指向与C相同对象的另一个数组引用。D继续引用不仅是"当前位置/状态",但相同的对象,直到它被重新分配或它超出范围。无论您对D所引用的对象做了什么,通过C也将可见,因为它是同一个对象。

最新更新