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

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

最佳答案

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

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;
    }
}

并使用getters / setters代替直接访问属性。
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

还要注意,字符串通常用双引号引起来。将来,请不要从编辑器中粘贴实际的,可编译的且可工作的代码,而不要在顶部或顶部键入该代码。避免红鲱鱼。

10-07 19:47