有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么对v,w的赋值行为不同?

我希望v上有一个浅拷贝,输出701801,但我看到了700801。我看不出一个好的解释。如果w是浅拷贝,为什么v不是?整数是否分配了整数“rebox”

class Scalar {
    Integer w;
    public String toString() { return String.valueOf( w ); }
}

public class Demo {
    public Integer v;
    public Scalar scal;

    Demo shallowCopy() {
        Demo scopy = new Demo();
        scopy.v = this.v;  // <- Given this I would 701 from 
        scopy.scal = this.scal;
        return scopy;
    }

    public String toString() { return String.valueOf(v) + " " + scal.toString();  }

    public static void main( String[] args ) {
        Demo d1 = new Demo();
        d1.v = 700;
        d1.scal = new Scalar();
        d1.scal.w = 800;
        Demo d2 = d1.shallowCopy();
        d2.v = 701;
        d2.scal.w = 801;
        System.out.println( d1 );
    }
}

共 (1) 个答案

  1. # 1 楼答案

    d2.v = 701;替换整个Integer

    您的浅层副本复制了对d1持有的Integer对象的引用,因此d2.v引用的是Integer对象本身,而不是d1.v

    另一方面,d2.scal没有被替换。因此,d1.scal等于d2.scal,因为它们是完全相同的对象。如果更改scal.w,它会更改该对象中的值,这将同时更改d1.scald2.scal。同时,覆盖d2.v会更改引用,但不会更改d2.v本身指向的对象,因此不会更改d1.v