Java中的浅拷贝

Vil*_*ius 4 java constructor copy

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

public class Shallow {
String name;
int number;

 public Shallow (Shallow s) {
  this.name = s.name;
  this.number = s.number;
 }
}
Run Code Online (Sandbox Code Playgroud)

测试实施......

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);
}
}
Run Code Online (Sandbox Code Playgroud)

按照我的意图,只复制非原始数据类型String的引用,以便通过调用"shallowClone.name ='Peter';" 我也会更改"浅"的名称.我对吗?但不知何故,它只是不想工作....

Bal*_*usC 5

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用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
Run Code Online (Sandbox Code Playgroud)

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