2010-04-25 122 views
4

我已经知道,浅拷贝是什么,但我不能提示它。这是一个简短的例子。Java中的浅拷贝

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 =‘彼得’; “我也会改变“浅”的名字。我对吗?但不知何故,它只是不想工作....

+0

'新的浅(浅)'构造函数代码是怎么样的?你没有把它包括在问题中,而问题可能在那里引起。值得注意的是字符串是不可变的。 – BalusC 2010-04-25 18:08:20

+0

刚刚编辑了构造函数。 此外:我其实喜欢只是复制对象的引用 - 这是目标;) – Vilius 2010-04-25 18:13:45

回答

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

并使用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 

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

+0

好吧,好的。我想我已经明白了!非常感谢你:) – Vilius 2010-04-25 18:26:49

+0

不客气。 – BalusC 2010-04-25 18:29:51