Java中的浅拷贝

4

我已经知道什么是浅拷贝,但我无法实现它。这里有一个简短的例子。

public class Shallow {
String name;
int number;

 public Shallow (Shallow s) {
  this.name = s.name;
  this.number = s.number;
 }
}

测试实现...

public class ShallowTest {
public static void main (String[] args) {
    Shallow shallow  = new Shallow("Shallow", 123);
 Shallow shallowClone = new Shallow(shallow);
    shallowClone.name = 'Peter';
    shallowClone.number = 321;
    System.out.println(shallow.name + " - " + shallow.number);
}
}

根据我的理解,仅仅是非原始数据类型String的引用会被复制,因此通过调用“shallowClone.name = 'Peter';”,我也会改变“shallow”的名称。我是对的吗?但不知何故,它就是无法工作...


“new Shallow(shallow)” 构造函数的代码是什么样子的?你在问题中没有包含它,而问题很可能就出在那里。还应该注意到字符串是不可变的。 - BalusC
刚刚编辑了构造函数。 另外:我喜欢只复制对象的引用 - 这是目标 ;) - Vilius
1个回答

6

字符串和整数是不可变的。将数据结构修改为使用可变结构来保存引用,例如数组或集合。例如:

public class Shallow {
    private Object[] properties = new Object[2];

    public Shallow(String name, int number) {
        this.properties[0] = name;
        this.properties[1] = number;
    }

    public Shallow(Shallow s) {
        this.properties = s.properties;
    }

    public String getName() {
        return (String) properties[0];
    }

    public void setName(String name) {
        this.properties[0] = name;
    }

    public int getNumber() {
        return (Integer) properties[1];
    }

    public void setNumber(int number) {
        this.properties[1] = number;
    }
}

使用getter/setter而不是直接访问属性。

Shallow shallow = new Shallow("Shallow", 123);
Shallow shallowClone = new Shallow(shallow);
shallowClone.setName("Peter");
shallowClone.setNumber(321);
System.out.println(shallow.getName() + " - " + shallow.getNumber()); // Peter - 321

同时请注意,字符串通常需要用双引号括起来。未来,请复制并粘贴您的编辑器中实际可编译和工作的代码,而不是从头开始输入。避免转移注意力。


好的,我明白了!非常感谢 :) - Vilius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接