Java中的浅拷贝

时间:2010-04-25 18:05:06

标签: java constructor copy

我已经知道,这是一个浅薄的副本,但我无法暗示它。这是一个简短的例子。

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';”我也会更改“浅”的名称。我对吗?但不知何故,它只是不想工作....

1 个答案:

答案 0 :(得分:5)

字符串和整数是不可变的。修改您的数据结构以使用包含引用的可变结构,例如数组或集合。 E.g。

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

另请注意,字符串通常用双引号引用。将来,从编辑器中复制实际的,可编译的和可用的代码,而不是在头顶或顶部输入。避免红鲱鱼。